所以我有一个 db_functions.js 文件,其中包含一些与数据库交互的函数。这是其中的一部分:
function getUsers(client, fn){
//var directors = {};
client.keys('*', function(err, keys){
keys.forEach(function(key){
client.hgetall(key, function(err, vals){
fn(key, vals);
});
});
});
我在另一个文件中使用 getUsers 函数:
router.get('/accounts', function(req, res){
var dir = {};
db_functions.getUsers(client, function(key, vals, cb){
dir[key] = vals;
cb(dir);
function cb(f){
var final_dir = {};
console.log(f)
res.json(f);
}
}
)});
我尝试使用回调从数据库获取一些信息,使用该信息更新 JSON 对象,当我使用所有信息更新该对象时,发送 JSON 对象作为响应。
问题出在 cb 函数中,res.json 被多次调用,这给出了“发送后无法设置 header ”错误。 res.json 仅应在 dir 更新完成后调用
最佳答案
res.json should only be called once dir is done updating
为什么不在收集完所有数据后才调用 getUsers
回调?
function getUsers(client, fn){
client.keys('*', function(err, keys) {
var values = {};
var remainingRequests = keys.length;
keys.forEach(function(key) {
// Note that this will run keys.length requests in parallel
// forEach does not (and cannot) wait for the async calls to finish
client.hgetall(key, function(err, vals){
remainingRequests -= 1;
if (!err) {
values[key] = vals;
}
if (remainingRequests === 0) {
fn(values);
}
});
});
});
}
outer.get('/accounts', function(req, res){
db_functions.getUsers(client, function(values){
res.json(values);
});
});
关于javascript - 使用回调函数更新 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31039673/