Обработка ошибок функции 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
свойство (и другие, если это то, что вы хотели бы) включены.