簡體   English   中英

為什么MongoDB不保存我的屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM