首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么MongoDB不保存我的属性

为什么MongoDB不保存我的属性
EN

Stack Overflow用户
提问于 2015-11-27 05:17:02
回答 5查看 1.8K关注 0票数 8

我用一些虚拟数据填充我的数据库,在那里我试图添加一个用户。已创建用户对象,但未保存任何属性...怎么了?

代码语言:javascript
复制
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" });
        }
    });
});

调用此函数将返回“用户已创建”。下面是我输出所有用户的方法:

代码语言:javascript
复制
app.get('/users', function(req, res) {

    User.find({}, function(err, user) {
        res.json(user);
    });
});

这里的输出是

代码语言:javascript
复制
[
  {
    "_id": "565772db5f6f2d1c25e999be",
    "__v": 0
  },
  {
    "_id": "5657734ba859fefc1dca77db",
    "__v": 0
  },
  {
    "_id": "5657738ba859fefc1dca77dc",
    "__v": 0
  },
  {
    "_id": "565774f1cf99a2b81fca1e7f",
    "__v": 0
  },
  {
    "_id": "565775f0cf99a2b81fca1e80",
    "__v": 0
  }
]

我试着加了几次“尼克”...是否有任何输入?:D

我的Mongoose模型,与其他模型一起位于它自己的Model.js文件中:

代码语言:javascript
复制
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, 
}));
EN

回答 5

Stack Overflow用户

发布于 2015-11-27 05:37:10

假设您的user Schema中有一个名称,您还需要等待save()查询完成,然后发送响应:

代码语言:javascript
复制
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" });
        });
    });
});
票数 5
EN

Stack Overflow用户

发布于 2015-12-03 00:24:15

请尝试使用此代码:

代码语言:javascript
复制
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" });
            })

        }
    });
});
票数 4
EN

Stack Overflow用户

发布于 2015-12-06 00:26:40

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

Node.js的工作方式完全不同于其他语言,如Java、PHP、Ruby、ASP.net等。Javascript本质上是完全异步的,Node.js在事件驱动和非阻塞I/O方面对其进行了改进。因此,除非收到所在函数的响应,否则代码不会继续执行。

因此,在执行save()方法之后,它会使用一个回调函数进行响应,该回调函数将一个完成响应发送到node.js,这样它就可以触发其他执行。正确的代码将是

代码语言:javascript
复制
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方法之后的每一段代码都将被写入该回调中。

如果我们花一分钟时间来分析问题所在,

代码语言:javascript
复制
var nick = new User({
    name: "Nick",
}).save();

res.json({ "success": true, "msg": "user created" });

当调用save()方法时,node.js会将数据与插入触发器一起发送给mongodb,然后继续执行其余的代码。即使数据还没有被保存,代码也会输出“成功”。因此,几乎Node.js中的每个方法都有一个回调,作为它的最后一个参数,它发送一个完成的指示。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33947121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档