node js和mongodb异步问题

时间:2017-12-04 17:26:30

标签: javascript node.js mongodb asynchronous

我是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})})
		}
	})




1 个答案:

答案 0 :(得分:0)

正如已经指出的那样,findOne返回一个promise。

您可以处理对findOne结果成功或失败执行回调的承诺

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

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)

OR

你可以包装userExist函数体来返回一个promise

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