Node JS如何pipe理全局variables,因为他是单线程和asynchronous的?

我试图用NodeJs开发一个API,它接受一个包含多个查询的对象到mongdb,并用不同的结果(实际上是Json)来回答一个对象。

我使用快递,我的代码是:

var nb_query=0; var results; //api app.get("/api/:p",api); function api(req, res) { var jsonq=decodeURIComponent(req.params.p); //console.log(jsonq); var queries=JSON.parse(jsonq); nb_query=Object.keys(queries).length; results={}; for(var nq in queries) { // for each query do_find_query(nq,queries[nq], function() { //todo : managing head res.end(JSON.stringify(results)); } ); } } // end of api function function do_find_query (name_query,query,callback) { var collection=fdb.collection(query.collection); collection.find(query.find,query.fields,query.options).toArray(function(err,docs) { if(err) throw err; results[name_query]=docs; nb_query--; if(nb_query==0) callback(); } ); } 

正如你所看到的,我使用全局variables来存储结果和计数器nb_query。 我问自己是否有问题(现在不是,因为我一个人在服务器上,但是当我们将成千上万的时候:-))。

据我了解,节点,只有一个线程,我认为节点将敲定一个开始的工作,除非他鼓励一个IO接入。 在这种情况下,他用callback堆叠io,并开始回答新的请求。

如果这是正确的,我认为节点可以回答2个或更多不同的调用我的api(需要mongo调用),因此在共享的全局variables(只有一个线程)中存储不同的值。

如果这是对的,我也会知道改变它的最好方法是什么。 我有这样的想法,在api函数中声明结果和nb_query,并将其传递给do_find_query,但nb_query不是一个对象,因此没有正确更改。

我知道我可以把nb_query放在一个对象中,通过引用来传递它,但是我想首先知道它是否有必要,如果它是一个好方法,或者有更好的方法。

谢谢你的帮助 !

厄运。

————————————————– —————————-

编辑:我已经改变了我的代码,它似乎没有全局variables和没有asynchronous库(这是我用锤子扑苍蝇)

 //api app.get("/api/:p",api); function api(req, res) { var jsonq=decodeURIComponent(req.params.p); //console.log(jsonq); var queries=JSON.parse(jsonq); var query_names=Object.keys(queries); var results={}; var query_left=query_names.length; query_names.map( function(query_name) { var query=queries[query_name]; var collection=fdb.collection(query.collection); collection.find(query.find,query.fields,query.options).toArray(function(err,docs) { if(err) throw err; //todo : handle errors in a better way results[query_name]=docs; if(--query_left==0) res.json(results); } ); } ); } 

但是我还不知道这是否有必要做。 (我这么认为,但我在Node中是新的,所以…)

感谢mscdex作为他的答案让我知道res.json()并帮助我了解variables的范围。

尝试使用全局variables(使用asynchronous模块):

 var async = require('async'); // ... app.get('/api/:p', api); function api(req, res) { var jsonq = decodeURIComponent(req.params.p), queries = JSON.parse(jsonq), keys = Object.keys(queries), queriesLeft = keys.length, results = {}; async.each(keys, function(name, cb) { var query = queries[name], collection = fdb.collection(query.collection); collection.find(query.find, query.fields, query.options) .toArray(function(err, docs) { if (err) return cb(err); results[name] = docs; cb(); } ); }, function(err) { if (err) throw err; // TODO: handle better res.json(results); }); } // end of api function