【问题标题】:node js and mongodb asynchronous issuenode js和mongodb异步问题
【发布时间】:2017-12-04 17:26:29
【问题描述】:

我是 mongodb 的新手,在查询后更新局部变量时遇到问题。我正在使用节点 js,并且我有一个局部变量,我正在尝试根据我的查询结果进行更新,但似乎我的函数在查询之前返回。我知道节点 js 是异步的,但我在处理它时遇到了麻烦。你可以在下面看到我的代码:

function userExist(userList, username){
    //var usert = new UserSchema()
    var exist = false
    UserSchema.findOne({userName: username}, function (err, usert) {
      if (err) return handleError(err);
      if (usert) {
        // doc may be null if no document matched
        exist = true
      }
    })
    console.log("boolean " + bool)
    return exist
  	// return username in userList
    // return query
}

我还有一个不同但不相关的问题,我试图从查询结果中提取特定值。我的架构如下:

//import dependency
var mongoose = require('mongoose')
var Schema = mongoose.Schema
//create new instance of the mongoose.schema. the schema takes an
//object that shows the shape of your database entries.
var UserSchema = new Schema({
 userName: String,
 userID: String,
 Conversations: [
   {
     conversationID: String,
     messages: [
       {
         message: String,
         messageID: String,
         sender: String,
         time: String
       }
     ]
   }
 ]
})
//export our module to use in server.js
module.exports = mongoose.model('User', UserSchema)

我正在尝试获取对话数组中的值,向其中添加新对话并将其推回数据库中。

任何一个问题的答案都会非常有帮助和感激。

只是为了澄清,这是我使用 userExist 函数的地方:

//Verify Username
	socket.on(VERIFY_USER, (nickname, callback)=>{
		if(userExist(connectedUsers, nickname)){
      console.log("user exist")
			callback({ userExist:true, user:null })
		}else{
      console.log("user does not exist")
			callback({ userExist:false, user:createUser({name:nickname, socketId:socket.id})})
		}
	})

【问题讨论】:

  • findOne 是异步的,所以 userExist 应该返回一个承诺。

标签: javascript node.js mongodb asynchronous


【解决方案1】:

如前所述,findOne 返回一个承诺。

您可以在 findOne 结果的成功或失败时处理 Promise 执行回调

定义两个函数作为回调传递

function success(user){
    //no error check 
    //doc has been found
    //do something 
    } ;
function fail(err){
    console. log(err) 
    }

然后在findOne函数体中

if (err) return fail(err) ;
//else
return success(user)

您可以包装 userExist 函数体以返回一个承诺

function userExist(userList, username){
  return new Promise(function(resolve, reject){
    var exist = false
    UserSchema.findOne({userName: username}, function (err, usert) {
      if (err) return reject(err);
      if (usert) {
        // doc may be null if no document matched
        exist = true
        resolve(exist)
      }
    })
})   
}

当你调用 userExist

 userExist(userList, username).then(function(user){
       //do something with the user
    }).catch(function(reason) {
         console.error(reason);
    });

【讨论】:

  • 这并没有真正达到预期的效果。我在 if 语句中调用 userexist 函数,每当我调用它时,它都会在 if 语句执行后返回。 if(userexist){do something} else {do something else}
  • findOne 是异步的,你必须用 Promise 或回调来处理它,我添加了一个替代方案,希望它可以帮助你
  • 它确实有很大帮助,必须将解决方案从 if 语句中移出,现在一切正常,谢谢您
猜你喜欢
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
相关资源
最近更新 更多