Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点js Mongodb findOne未同步工作_Javascript_Node.js_Mongodb_Mongodb Query - Fatal编程技术网

Javascript 节点js Mongodb findOne未同步工作

Javascript 节点js Mongodb findOne未同步工作,javascript,node.js,mongodb,mongodb-query,Javascript,Node.js,Mongodb,Mongodb Query,我有一个包含用户和令牌列表的mongodb数据库。当我使用query来findOne with query时,它返回undefined。findOne的代码如下所示: var getApiTokenForUser = function(user){ console.log('get api token for :'+user); var collection = db.collection(user_token_collection_name); var result; if(collectio

我有一个包含用户和令牌列表的mongodb数据库。当我使用query来findOne with query时,它返回undefined。findOne的代码如下所示:

var getApiTokenForUser = function(user){
console.log('get api token for :'+user);
var collection = db.collection(user_token_collection_name);
var result;
if(collection){
    console.log("cursor query: "+user);
    var cursor = collection.findOne({'user':user});
    console.log("cursor result: "+JSON.stringify(cursor));
}
return result;}
 get api token for :Zeus
 cursor query: Zeus
 cursor result: {}
 getApiTokenForUser return: undefined
我为findOne打印的日志如下:

var getApiTokenForUser = function(user){
console.log('get api token for :'+user);
var collection = db.collection(user_token_collection_name);
var result;
if(collection){
    console.log("cursor query: "+user);
    var cursor = collection.findOne({'user':user});
    console.log("cursor result: "+JSON.stringify(cursor));
}
return result;}
 get api token for :Zeus
 cursor query: Zeus
 cursor result: {}
 getApiTokenForUser return: undefined
但如果我使用find而不是findOne,我可以得到用户列表,但仅在日志中,它仍然返回未定义的

查找的代码为:

var getApiTokenForUser = function(user){
console.log('get api token for :'+user);
var collection = db.collection(user_token_collection_name);
var result;
if(collection){
    console.log("cursor query: "+user);
    var cursor = collection.find({'user':user});
    cursor.forEach(function(data) {
        result = data;
        console.log("cursor result: "+JSON.stringify(data));
    });
}
return result;}
记录如下:

cursor query: Zeus
getApiTokenForUser return: undefined
saveUserApiToken
cursor result: {"_id":"58a56442545e812a68f87bbe","user":"Zeus","token":"eyJhbGci
OiJIUzI1NiJ9.WmV1cw.mAQh65o-d2tOp_Fchi7iPm5pu_2f4QSXOAQ5JtoEe10"}

我想让findOne同步工作。有什么办法吗?

您可以将同步代码放在findOne的回调中。例如:

collection.findOne({'user':user}, function(error,user) {    
     //Synchornous code here
})

希望我的回答对您有所帮助。

您在第一个代码片段中从未将结果分配给任何内容。您的代码已简化:

var result; // you never assign anything to it
return result; // undefined

您能告诉我们调用getApiTokenForUser函数的上下文吗?在Node.js中,您不能让findOne以同步方式工作,但您可以使用承诺来实现这一点。我使用它来验证用户。当用户登录时,我将令牌和用户保存在mongodb中,并使用每个rest API检查令牌是否有效。首先,不要使用node.js同步word。想象一下,你有1000个用户在实时使用你的站点。您同步执行此调用的事实是,所有1000个用户都需要等待代码执行。。。以这种方式异步运行,其他999名用户可以继续使用你的应用程序。我同意,但我仍在寻找同步解决方案。此服务器将在封闭组中使用,这就是为什么我们不希望一次登录超过10个。谢谢。更正。但它仍然返回空对象,而find返回list。