Обработка ошибок функции NodeJS Mongoose Schema 'save'?

у меня возникла проблема с выводом ошибки пользователю с помощью res.send (err), который вызывается в обратном вызове функции "сохранить" пользовательских схем Мангуста. Я хотел бы отметить это, когда я использую console.журнал (err), он показывает ожидаемую ошибку (например, имя пользователя слишком короткое), но res.send выводит "{} " в PostMan при отправке запроса со значениями POST, которые должны вызвать ошибку.

также мне интересно, должен ли я выполнять проверку ввода в моем маршрутизаторе или в моем Пользовательские схемы мангуста .функция pre? Установка проверки там кажется правильной, так как она держит мой файл маршрутизатора узла намного чище.

вот код, о котором идет речь...

app / маршруты / 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' });
        }
    });

});
...

приложение / модели / пользователь.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 ответов


С первого взгляда кажется, что вы используете express. Когда объект или массив передается в res.send() (как и в случае возникновения ошибки), по умолчанию используется JSON.stringify на объекте / массиве и устанавливает content-type в application/json. (Ref:http://expressjs.com/4x/api.html#res.send). Свойство message объекта Error не сериализуется при его передаче через JSON.stringify потому что он определен с enumerable будучи false.

Ex.

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

невозможно ли stringify ошибку с помощью JSON.преобразовать в строки? есть несколько примеров того, как убедитесь, что message свойство (и другие, если это то, что вы хотели бы) включены.