我用一些虚拟数据填充我的数据库,在那里我试图添加一个用户。已创建用户对象,但未保存任何属性...怎么了?
app.get('/setup', function (req, res) {
User.findOne({ name: "Nick" }, function (err, user) {
if (user == undefined) {
var nick = new User({
name: "Nick",
}).save();
res.json({ "success": true, "msg": "user created" });
} else {
res.json({ "success": true, "msg": "user existed" });
}
});
});调用此函数将返回“用户已创建”。下面是我输出所有用户的方法:
app.get('/users', function(req, res) {
User.find({}, function(err, user) {
res.json(user);
});
});这里的输出是
[
{
"_id": "565772db5f6f2d1c25e999be",
"__v": 0
},
{
"_id": "5657734ba859fefc1dca77db",
"__v": 0
},
{
"_id": "5657738ba859fefc1dca77dc",
"__v": 0
},
{
"_id": "565774f1cf99a2b81fca1e7f",
"__v": 0
},
{
"_id": "565775f0cf99a2b81fca1e80",
"__v": 0
}
]我试着加了几次“尼克”...是否有任何输入?:D
我的Mongoose模型,与其他模型一起位于它自己的Model.js文件中:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
// set up a mongoose model and pass it using module.exports
module.exports = mongoose.model('User', new Schema({
name: String,
password: String,
}));发布于 2015-11-27 05:37:10
假设您的user Schema中有一个名称,您还需要等待save()查询完成,然后发送响应:
app.get('/setup', function (req, res) {
User.findOne({ name: "Nick" }, function (err, user) {
if (err) {
return res.json({ "success": false, "error": err });
}
if (user) {
return res.json({ "success": true, "msg": "user existed" });
}
var nick = new User({ name: "Nick" });
nick.save(function(err, userObj) {
if (err) {
return res.json({ "success": false, "error": err });
}
res.json({ "success": true, "msg": "user created" });
});
});
});发布于 2015-12-03 00:24:15
请尝试使用此代码:
app.get('/setup', function (req, res) {
User.findOne({ name: "Nick" }, function (err, user) {
if (!err && user) {
res.json({ "success": true, "msg": "user existed" });
}
else {
var nick = new User({name: "Nick" });
nick.save(function(err){
if(!err)
res.json({ "success": true, "msg": "user created" });
})
}
});
});发布于 2015-12-06 00:26:40
您调用的save()函数不正确,它遵循其他语言的模式,而不是Node.js。
Node.js的工作方式完全不同于其他语言,如Java、PHP、Ruby、ASP.net等。Javascript本质上是完全异步的,Node.js在事件驱动和非阻塞I/O方面对其进行了改进。因此,除非收到所在函数的响应,否则代码不会继续执行。
因此,在执行save()方法之后,它会使用一个回调函数进行响应,该回调函数将一个完成响应发送到node.js,这样它就可以触发其他执行。正确的代码将是
var user = new User({name: 'Nick'});
user.save(function(err, savedUser) {
if(err) return res.send(err);
return res.json({'message': 'User created!', user: savedUser});
});因此,正如您所看到的,只要save()方法完成,它就会在回调中响应err和savedUser,而不是返回它们,并且save方法之后的每一段代码都将被写入该回调中。
如果我们花一分钟时间来分析问题所在,
var nick = new User({
name: "Nick",
}).save();
res.json({ "success": true, "msg": "user created" });当调用save()方法时,node.js会将数据与插入触发器一起发送给mongodb,然后继续执行其余的代码。即使数据还没有被保存,代码也会输出“成功”。因此,几乎Node.js中的每个方法都有一个回调,作为它的最后一个参数,它发送一个完成的指示。
https://stackoverflow.com/questions/33947121
复制相似问题