【问题标题】:Why doesn't MongoDB save my properties为什么 MongoDB 不保存我的属性
【发布时间】:2016-03-01 01:12:05
【问题描述】:

我在我的数据库中填充了一些我试图添加用户的虚拟数据。创建了一个用户对象,但没有保存任何属性...这是怎么回事?

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”,但没有...任何输入? :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, 
}));

【问题讨论】:

  • 改保存到.save(function(err,user){ console.log(err)}) 看看有没有错误
  • User 对象从何而来?你在用猫鼬吗?
  • 没有错误,我正在使用猫鼬是的
  • 那么我建议添加相应的标签以获得更好的答案,并且不会让人们误以为您的脚本依赖于纯 mongo。
  • 我测试了您的确切设置,一切正常。它能够使用名称字段保存新用户。我会推荐 Lisa 的设置。

标签: javascript node.js mongodb mongoose


【解决方案1】:

假设您在用户架构中有一个名称,您还需要等到您的 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" });
        });
    });
});

【讨论】:

  • 我为什么要等待?在我发送 /setup 和 /users 之间经过了几秒钟
  • 因为 save() 方法是异步的,在发送成功响应之前,您需要确保没有错误并且文档插入成功。
【解决方案2】:

请尝试使用此代码:

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

        }
    });
});

【讨论】:

  • 请添加有关更改内容和原因的更多信息
  • if (!err && user) 如果没有发生错误或获取用户,此条件将起作用。如果在 db 中找不到用户,则 else 函数将起作用并创建一个新用户。
【解决方案3】:

你调用的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 中的每个方法都有一个回调,因为它是发送完成指示的最后一个参数。

【讨论】:

    【解决方案4】:

    您需要在 User 架构中定义 name 键才能保存它。

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

    【讨论】:

    • 是的,忘了添加,但我已将名称键添加到架构中。我可以在同一个文件中有多个场景吗?因为现在我已经在 Models.js 文件中获得了所有“模型”。这包括一个用户,也包括其他人。
    • 是的,您可以将所有“模型”放在同一个文件中,但不建议这样做。如果它帮助您解决问题,也将答案标记为已接受。
    • 它没有解决我的问题,我说我忘了添加代码。否则“用户”根本不会起作用。
    【解决方案5】:

    这是您的代码,它可以工作。我只将module.exports 更改为var User,因为要在单个页面中收集代码。

    那么,可能还有其他问题吗?

    祝你好运……

    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')
    })
    

    Postman 结果;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2018-05-22
      • 2019-07-27
      • 1970-01-01
      相关资源
      最近更新 更多