NodeJS Mongoose Schema'save'函数错误处理?
我在使用res.send(err)向用户输出错误时遇到问题,该问题在Mongoose User Schema的“保存”功能的回调中调用。 我想要注意的是,当我使用console.log(err)时,它显示预期的错误(例如用户名太短),但res.send在发送具有POST值的请求时在PostMan中输出“{}”应该会导致错误。
另外我想知道是否应该在我的路由器或我的Mongoose用户模式.pre函数中进行输入验证? 把验证看起来是正确的,因为它使我的节点路由器文件更清洁。
这是有问题的代码...
应用程序/路由/ apiRouter.js
var User = require('../models/User');
var bodyParser = require('body-parser');
...
apiRouter.post('/users/register', function(req, res, next) {
var user = new User;
user.name = req.body.name;
user.username = req.body.username;
user.password = req.body.password;
user.save(function(err) {
if (err) {
console.log(err);
res.send(err);
} else {
//User saved!
res.json({ message: 'User created' });
}
});
});
...
应用程序/模型/ user.js的
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var bcrypt = require('bcrypt-nodejs');
var validator = require('validator');
var UserSchema = new Schema({
name: String,
username: { type: String, required: true, index: {unique: true} },
password: { type: String, required: true, select: false }
});
UserSchema.pre('save', function(next) {
var user = this;
if (!validator.isLength(user.name, 1, 50)) {
return next(new Error('Name must be between 1 and 50 characters.'));
}
if (!validator.isLength(user.username, 4, 16)) {
return next(new Error('Username must be between 4 and 16 characters.'));
}
if (!validator.isLength(user.password, 8, 16)) {
return next(new Error('Password must be between 8 and 16 characters.'));
}
bcrypt.hash(user.password, false, false, function(err, hash) {
user.password = hash;
next();
});
});
UserSchema.methods.comparePassword = function(password) {
var user = this;
return bcrypt.compareSync(password, user.password);
};
module.exports = mongoose.model('User', UserSchema);
快速浏览一下,看起来你使用的是快递。 当对象或数组传递给res.send()
(如发生错误时),它默认在对象/数组上使用JSON.stringify
,并将content-type设置为application/json
。 (参考:http://expressjs.com/4x/api.html#res.send)。 错误对象的消息属性在通过JSON.stringify
传递时未被序列化,因为它的enumerable
为false
。
防爆。
$ node
> var err = new Error('This is a test')
undefined
> console.log(JSON.stringify(err))
{}
undefined
是不可能使用JSON.stringify对错误进行串联? 有一些如何确保message
属性(和其他人,如果这是你想要的)被包括在内的例子。