【问题标题】:Returning undefined from MongoDB, but the Document exists. The query should work从 MongoDB 返回 undefined,但 Document 存在。查询应该有效
【发布时间】:2014-07-17 15:35:39
【问题描述】:

我正在创建一个架构,并且正在 MongoDB 中保存一个文档。

架构:

var userSchema = new Schema({

        userID: Number,
        userName: String,
        userEmail: String,
        teams:Array,
        fbUID: String,
        googleUID: String,
        twitter: String 


});

文档:

var users = mongoose.model('users',userSchema);

    if(socialMediaType == "fbUID"){
         var user = new users({
            userID: id, //give the id of the next user in Dbase
            userName: userName, 
            userEmail: 'userEmail',
            teams:[],
            fbUID : socialMediaID
         });

其中 socialMediID 是在函数中传递的参数。

我正在保存:

 user.save(function(err, user){
        if(err) return console.error(err);
        log.d("user saved", user);
     });

我的查询:

    function searchUser(socialMediaID, socialMediaType){
        var user

        if(socialMediaType == "fbUID"){

             users.findOne({'fbUID': socialMediaID}, function(err, userFound){

            if(err) return handleError(err);
           user = userFound; 
         });
return user

当我这样打印用户时:

log.d("user retrieved from Database", user)

它是这样未定义的:

user retrieved from Database undefined

当我在终端上搜索时:

 db.users.find()

我明白了:

{ "_id" : ObjectId("53c6a25ff34dc62bac05f6e9"), "userName" : "Andressa", "userEmail" : "userEmail", "teams" : [ ], "__v" : 0 }
{ "_id" : ObjectId("53c6b3dfedf9710db27740b2"), "userName" : "Andressa", "userEmail" : "userEmail", "fbUID" : "1234", "teams" : [ ], "__v" : 0 }
{ "_id" : ObjectId("53c6b3e0edf9710db27740b4"), "userName" : "Andressa", "userEmail" : "userEmail", "fbUID" : "1234", "teams" : [ ], "__v" : 0 }
{ "_id" : ObjectId("53c6b3e1edf9710db27740b6"), "userName" : "Andressa", "userEmail" : "userEmail", "fbUID" : "1234", "teams" : [ ], "__v" : 0 }
{ "_id" : ObjectId("53c6b3e2edf9710db27740b8"), "userName" : "Andressa", "userEmail" : "userEmail", "fbUID" : "1234", "teams" : [ ], "__v" : 0 }'

当我在终端上搜索时:

 db.users.findOne({fbUID:"1234"})

我明白了:

    > db.users.findOne({fbUID:"1234"})
{
    "_id" : ObjectId("53c6c8b3dc1ea36cb7f5f8e1"),
    "userName" : "Andressa",
    "userEmail" : "userEmail",
    "fbUID" : "1234",
    "teams" : [ ],
    "__v" : 0
}

有人知道我做错了什么吗?

感谢您的理解。

【问题讨论】:

  • 知道文档保存后,能否从运行相应查询的mongodb shell中找到该文档?
  • @sigurdga,我更新了问题。
  • 你做user = userFound的例子是真实的代码吗?在这种情况下,这是因为您尝试在异步回调中设置值时返回 user。例如,请参阅 How to return value from asynchronous function 了解如何解决该问题。
  • @AndreasHultgren,好的。是的,这是真正的代码。谢谢你。我去查一下。

标签: node.js mongodb mongoose undefined mongodb-query


【解决方案1】:

问题是您正在像 C 一样编写 JavaScript。

find 函数有一个回调,所以你不能从它返回值。

当你这样做时:

users.findOne({'fbUID': socialMediaID}, function(err, userFound){
   if(err) return handleError(err);
   user = userFound; 
});
return user;

返回值为 null,因为 findOne 运行异步。

要修复,只需这样做:

function searchUser(socialMediaID, socialMediaType, cb){
    if(socialMediaType == "fbUID") {

        users.findOne({'fbUID': socialMediaID}, cb);
    }
    cb(true);
}

欢迎来到回调地狱 :)

【讨论】:

  • 我是否只将“真”作为论据?例如:cb(true)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 2023-03-20
  • 1970-01-01
  • 2018-08-28
相关资源
最近更新 更多