NodeJS Mongoose Schema'save'函数错误处理?

时间:2015-07-23 13:03:33

标签: node.js validation error-handling mongoose

我在使用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);

1 个答案:

答案 0 :(得分:2)

从快速浏览一下,看起来你正在使用快递。当对象或数组传递给res.send()时(如果发生错误),它默认使用对象/数组上的JSON.stringify并将内容类型设置为application/json。 (参考:http://expressjs.com/4x/api.html#res.send)。 Error对象的message属性在通过JSON.stringify时未被序列化,因为它是enumerablefalse定义的。

实施例

 $ 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属性(以及其他符号,如果你想要的话)。