[英]Why doesn't MongoDB save my properties
我正在使用一些虛擬數據填充我的數據庫,我正在嘗試添加用戶。 創建了一個用戶對象,但沒有任何屬性保存...最新消息?
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
}
]
在哪里我試圖添加“Nick”幾次noe ...任何輸入? :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本質上是異步的,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中的幾乎每個方法都有一個回調,因為它是最后一個發送完成指示的參數。
您需要在用戶架構中定義名稱密鑰才能保存。
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var userSchema = new Schema({
name: String
});
var User = mongoose.model('User', userSchema);
這是你的代碼,它的工作原理。 我只使用var User
更改了module.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')
})
郵差結果;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.