为什么MongoDB不保存我的属性

我正在填充我的数据库与一些虚拟数据,我试图添加一个用户。 一个用户对象被创build,但没有任何属性保存…怎么了?

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" }); } }); }); 

调用这个返回“用户创build”。 这是我的方法来输出所有用户:

 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 } ] 

在哪里我试图添加“尼克”几次noe …任何input? :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, })); 

鉴于您在用户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" }); }); }); }); 

请尝试这个代码:

 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" }); }) } }); }); 

您调用的save()函数不正确,并且遵循其他语言的模式,而不是Node.js.

Node.js的工作方式与Java,PHP,Ruby,ASP.net等其他语言完全不同,Javascript在本质上完全是asynchronous的,而Node.js在事件驱动和非阻塞I / O 。 所以代码执行不会继续,除非它从它所在的函数收到响应。

因此,在执行save()方法之后,它会回应一个callback函数,向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方法后面的每一个代码都将被写入callback函数中。

如果我们暂时拿你的代码,分析问题是什么,

 var nick = new User({ name: "Nick", }).save(); res.json({ "success": true, "msg": "user created" }); 

当调用save()方法时,node.js将数据和插入触发器一起发送给mongodb,然后继续执行其余的代码。 而且即使数据尚未保存,该代码仍在打印“成功”。 因此,几乎Node.js中的每个方法都有一个callback,因为它是最后一个参数,它发送完成的指示。

您需要在您的用户架构中定义名称密钥以保存它。

 var mongoose = require('mongoose'); var Schema = mongoose.Schema; var userSchema = new Schema({ name: String }); var User = mongoose.model('User', userSchema); 

这是你的代码,它的工作原理。 我只更改了var Usermodule.exports ,因为要在一个页面中收集代码。

那么,可能会有另一个问题呢?

祝你好运…

 var express = require('express') var mongoose = require('mongoose') var mongoDBUrl = "mongodb://1.0.0.1:27027/tests" var app = express() var Schema = mongoose.Schema; var User = mongoose.model('User', new Schema({ name: String, password: String, })); /* Mongoose Database connection */ mongoose.connect(mongoDBUrl) var db = mongoose.connection db.on('error', console.error.bind(console, 'Mongo connection error:')) db.once('open', function (callback) { console.log("MongoDB connection has established") }) 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) { console.log("/user works") User.find({}, function(err, user) { res.json(user); }); }); app.listen(1337, function() { console.log('node-app is listening HTTP port 1337') }) 

邮递员结果;

在这里输入图像描述