【问题标题】:Mongoose NodeJS only undefined values [duplicate]Mongoose NodeJS只有未定义的值[重复]
【发布时间】:2015-07-19 18:33:39
【问题描述】:

现在我玩过 nodeJS 和 SocketIO,一切都很好。 但是现在我被一个查询抓住了!

// User Auth Event
socket.on('userAuth', function(userObj) {

     var queryUserAuth = User.find({
         name : userObj.name
     })
     .where('password',userObj.pword);
     queryUserAuth.exec(function(err, userData){

        if(err) {
            socket.emit('userAuthOK',err);
            console.log('!! User: %s or PW not OK', userObj.name);
            return handleError(err);
        }else {
            console.log('User: %s known, userID: %s', userObj.name, userData.userid);
            socket.emit('userAuthOK', userData.userid);
            socket.join(userData.userid); // Create new room / join this room
        }
     });

});

但是 var "userData" 一直是空的,并且上面的 console.log 告诉我 "User: testuser known, userID: undefined"。 我无法通过这种方式从 MongoDB 中获取此用户对象,但如果我使用 mongo 控制台,我可以找到该用户。

/////////// 编辑: 经过一些更改...这里是新代码...但仍然没有找到正确的记录并得到空结果。

// User Auth Event
socket.on('userAuth', function(userObj) {
     var queryUserAuth = User.findOne({
         name : userObj.name,
         password : userObj.pword
     });
         //.where("password").equals(userObj.pword);
    queryUserAuth.exec(function(err, userData){

        if(err) {
            socket.emit('userAuthOK',err);
            console.log('!! User Auth Error: %s', err);
            return handleError(err);
        }else {
            if(!userData){
                console.log('!! User: %s or PW not OK.', userObj.name);
                socket.emit('userAuthOK','fail');
            }else {
                console.log('User: %s known, userID: %s', userObj.name, userData);
                socket.emit('userAuthOK', userData);
                socket.join(userData.userid); // Create new room / join this room
            }
        }
     });

});

这里是在 mongo shell 上手动查询的输出:

db.user.find({name: 'testuser', password: 'test'}) { "_id" : ObjectId("55a8cc8240fdc97f108d4d11"), "userid" : "1", "name" : "testuser" ,“电子邮件”:“test@test.com”,“密码”:“测试”}

这是 userObj 的值:{ name: 'testuser', pword: 'test' }

///// EDIT2:

这里是user.js,包括User的猫鼬模型:

// Load the MongoDB module
var mongoose = require('mongoose');
// user schema
var userSchema = mongoose.Schema({
    userid: Number,
    name: String,
    email: String,
    password: String,
    status: Number
});


// compiling the user schema
var User = mongoose.model('User', userSchema);

// make this available to our users in our Node applications
module.exports = User;

这里是模型的包含:

// Load Mongoose models
var User = require('./models/user');

【问题讨论】:

  • 您是否尝试过搜索所有用户?您确定您已在 node.js 代码中连接到正确的数据库吗?
  • 是的,我做到了。一切都很好,其他查询运行没有任何问题。
  • @JohnnyHK:你是我的英雄!非常感谢!

标签: javascript node.js mongodb mongoose socket.io


【解决方案1】:

尝试记录userData 而不仅仅是userData.userid。它是一个数组,而不是一个对象。你想使用.findOne(),而不是.find()。

另外,查询方法的语法是:

.where("password").equals(userObj.pword)

或者,您可以将其添加到您原来的.findOne():

var queryUserAuth = User.findOne({
    name: userObj.name,
    password: userObj.pword
    });

此外,您的console.log('!! User: %s or PW not OK', userObj.name); 没有任何意义。找不到任何人与收到错误不同。您需要将该部分作为嵌套在 else 块中的单独的 if 语句来处理。

【讨论】:

  • 感谢您的回复。我也尝试过这种方式,结果为 NULL ... userObj 不显示任何内容,但 NULL。
  • 你的猫鼬语法是正确的,除了.find()。编辑:我看错了,应该是.where("password").equals(userObj.pword)
  • @km65 我会更新我的答案
  • 我已更改查询但仍为空。 :-(
  • @km65 你能把userObj 以及你找到的mongo shell 文档添加到你的帖子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 2018-04-03
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
相关资源
最近更新 更多