我在使用res.send(错误)向用户输出错误时出现问题,该错误在Mongoose用户架构“保存”功能的回调中被调用。我想要注意的是,当我使用console.log(错误)时,它显示预期的错误(例如用户名太短),但res.send在PostMan中输出“{}”时发送POST值为的值应该导致错误。
另外,我想知道我是否应该在路由器或Mongoose用户模式.pre函数中进行输入验证?验证似乎是正确的,因为它使我的Node路由器文件更加清洁。
以下是有问题的代码......
应用程序/路由/ 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);
答案 0 :(得分:2)
从快速浏览一下,看起来你正在使用快递。当对象或数组传递给res.send()
时(如果发生错误),它默认使用对象/数组上的JSON.stringify
并将内容类型设置为application/json
。 (参考:http://expressjs.com/4x/api.html#res.send)。 Error对象的message属性在通过JSON.stringify
时未被序列化,因为它是enumerable
为false
定义的。
实施例
$ node
> var err = new Error('This is a test')
undefined
> console.log(JSON.stringify(err))
{}
undefined
Is it not possible to stringify an Error using JSON.stringify?有一些示例,说明如何确保包含message
属性(以及其他符号,如果你想要的话)。