MongoDB赢得't第一次返回正确的数据

MongoDB won't return correct data first time round

本文关键字:返回 数据 第一次 赢得 MongoDB      更新时间:2023-09-26

这是我的代码:

// 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();
         });
      });
   }
});

 });

问题是,当我单击按钮以使用正确的信息对用户进行身份验证时,它会返回一个值"undefined",但如果我第二次按下按钮,它会从数据库中返回正确的数据,而不会更改任何内容。我想让它第一次显示以正确验证中的用户。我做错了什么?请帮忙。

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

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

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

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