【问题标题】:MongoDB won't return correct data first time roundMongoDB 第一次不会返回正确的数据
【发布时间】:2016-07-15 01:56:58
【问题描述】:

这是我的代码:

// Modules
var mongodb = require('mongodb');
var MongoClient = mongodb.MongoClient;
var url = 'mongodb://localhost:27017/affinity';
window.$ = window.jQuery = require('jquery');
var user_data;

$(document).ready(function () {

   // Look through db for user
   // Flters through the db to find the user and their password to authenticate them in.
  userInfo = function (db, callback) {
  var username = $('#username').val();
  var password = $('#password').val();
  var users = db.collection('users');

  // Searches through each user in the db to find one which meets conitions.
  var cursor = users.find({
     "username": username
  }, {"limit": 1} ).each(function (err, doc) {
     if (doc != null) {
        if (doc.password === password) {
           user_data = doc;
            //window.location.replace(__dirname + '/assets/views/main.html');
         } else {
            $("#error-hint").css(
               'visibility', 'visible'
            );
         }
      } else {
         // Skip user if it isn't matching
      }
   });
   console.log(user_data);
}

// Connects to database.
// Inserts all user data to the database.
MongoClient.connect(url, function (err, db) {
   if (err) {
      console.log('Couldn\'t connect to the mongoDB server. \nERROR: ' + err);
   } else {
      var collection = db.collection('users');

      // When login button run authUser function
      $('#auth-btn').click(function () {
         userInfo(db, function () {
            db.close();
         });
      });
   }
});


 });

问题是,当我单击按钮以使用正确的信息对用户进行身份验证时,它会返回一个“未定义”的值,但如果我再次按下该按钮,它不会从数据库中返回正确的数据。我希望它第一次显示以正确验证用户身份。我做错了什么?请帮忙。

【问题讨论】:

  • 我的回答有帮助吗?如果是,请接受它,如果没有更新问题。

标签: javascript jquery node.js mongodb mongoose


【解决方案1】:

您的意思是 console.log(user_data); 返回 undefined 数据?

那是因为你没有在回调中调用它,所以第一次调用console.log(user_data);时db查询没有找到用户。当您第二次调用它时,第一个数据库查询完成,所以 user_data 已经设置好,所以它会打印给您。第二次按下登录按钮时,请尝试查找其他用户。它将打印第一个用户的数据。

请注意,您的调用是异步的!因此,为了在查询完成后查看结果,只需将console.log(user_data); 放入传递给each 的回调函数中。

此外,如果您想将结果集限制为仅一个元素,请使用 db.collection.fidnOne({...}) 而不是 db.collection.find({...},{limit...}).each(...)

【讨论】:

  • 我将如何导出从数据库中获得的结果,以便在另一个文件中使用它。
  • 无论你传递给findeach 的回调函数,都会在查询返回的数据上调用。有关更复杂的示例,请参阅this question。另请注意,您的其他文件需要在此上下文中可访问,因此您很可能需要将此文件的某些部分包含在您的其他文件或此处的其他文件中。如果您使用的是 express,那么您已经通过 module.exportsrequire 获得了这种机制。
  • 从另一个文件调用它时,我得到了一个未定义的值。
  • 请更新您的问题以正确反映您的代码状态。由于当前问题没有包含任何其他文件,并且您尚未更新问题中的代码,因此我无法判断出什么问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 2020-06-21
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多