gpt4 book ai didi

node.js - NodeJS Mongoose Schema 'save' 函数错误处理?

转载 作者:搜寻专家 更新时间:2023-10-31 22:34:29 27 4
gpt4 key购买 nike

我在使用 res.send(err) 向用户输出错误时遇到问题,这是在 Mongoose 用户模式“保存”函数的回调中调用的。我想指出的是,当我使用 console.log(err) 时,它显示了预期的错误(例如用户名太短),但是 res.send 在发送带有 POST 值的请求时在 PostMan 中输出“{}”应该会导致错误。

另外我想知道我是否应该在我的路由器或我的 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);

最佳答案

乍一看,您似乎在使用 express。当对象或数组传递给 res.send() 时(比如在发生错误的情况下),它默认使用 JSON.stringify在对象/数组上并将内容类型设置为 application/json . (引用:http://expressjs.com/4x/api.html#res.send)。 Error 对象的消息属性在通过 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 的示例包括属性(property)(以及其他属性(property),如果这是您想要的)。

关于node.js - NodeJS Mongoose Schema 'save' 函数错误处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31588178/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com