gpt4 book ai didi

node.js - Node JS 是单线程且异步的,它如何管理全局变量?

转载 作者:太空宇宙 更新时间:2023-11-04 01:02:53 24 4
gpt4 key购买 nike

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

我使用express,我的代码是:

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

}

如您所见,我使用全局变量来存储结果和计数器 nb_query。我问自己这是否是一个问题(现在不是,因为我独自在服务器上,但是什么时候我们将达到数千亿?:-))。

据我了解 Node,只有一个线程,我认为 Node 将完成一项已启动的作业,除非他遇到 io 访问。在本例中,他将 io 与回调堆叠在一起,并开始响应新请求。

如果这是正确的,我认为 Node 可以响应对我的 api 的 2 个或更多不同的调用(需要 mongo 调用),因此将不同的值存储在共享的全局变量中(只有一个线程)。

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

我知道我可以将 nb_query 放入一个对象中以“通过引用”传递它,但我想首先知道是否有必要以及它是否是一个好方法或是否有更好的方法。

感谢您的帮助!

厄运。

------------------------------------------------------------ -------------------------------------------

编辑:我已经更改了我的代码,它似乎可以在没有全局变量和异步库的情况下工作(这对我来说是用锤子拍苍蝇)

//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() 并帮助我理解了变量的范围。

最佳答案

不要使用全局变量,而是尝试这个(使用 async 模块):

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

关于node.js - Node JS 是单线程且异步的,它如何管理全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25596978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com