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传递时未被序列化,因为它的enumerablefalse

防爆。

 $ node
 > var err = new Error('This is a test')
 undefined
 > console.log(JSON.stringify(err))
 {}
 undefined

是不可能使用JSON.stringify对错误进行串联? 有一些如何确保message属性(和其他人,如果这是你想要的)被包括在内的例子。

链接地址: http://www.djcxy.com/p/46461.html

上一篇: NodeJS Mongoose Schema 'save' function error handling?

下一篇: Handling exceptions in express