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

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