gpt4 book ai didi

javascript - node.js + socket.io + 结果需要多个数据库调用

转载 作者:IT王子 更新时间:2023-10-29 06:00:20 24 4
gpt4 key购买 nike

我需要帮助。

一天以来,我一直在尝试使用 node.js 和 socket.io 进行异步编程。我知道我需要一些流量控制,但我似乎不明白如何正确实现它。

我有一个 redis 数据存储,其中的模块存储在一个集合中,比如 'moda','modb'这些模块的实例是“moda:instances”,在“modb:instances”中,这些实例的属性作为散列存储在“moda:instancea”和“modb:instanceb”中。

我正在尝试获取以下 json:

"moda": {"instancea": {"property1": "value1", "property2", "value2"}}, "modb": {"instanceb": {"property1": "value1"}}

有人可以在正确的方向上插入我吗?

这是我当前的代码:

var io = require('socket.io').listen(2000);
var redis = require('redis').createClient();
var http = require('http');
var async = require('async');
var step = require('step');

io.sockets.on('connection', function (socket) {

var notifications = require('redis').createClient();
notifications.subscribe("notification");
notifications.on("message", function (channel, message) {
socket.send(message);
console.log(channel + ':' + message);
});

socket.on('modules', function(params, callback) {
var response = {};
async.series([

function (callback) {
console.log('1>');
redis.smembers('modules', function (err, modules) {
async.forEachSeries(modules, function(module, moduleCallback) {
response[module] = {}

redis.smembers(module + ':instances', function(err, instances) {
async.forEachSeries(instances, function(instance, instanceCallback) {
response[module][instance] = {}
console.log('2>' + module + ':' +instance);
instanceCallback();
});
moduleCallback();
});
});
callback();
});
},
function (callback) {
console.log('3');
callback();
}

], function() {
console.log(JSON.stringify(response));
});


});

});

这段代码的输出是:

   info  - socket.io started
debug - client authorized
info - handshake authorized JMMn1I8aiOMGCMPOhC11
debug - setting request GET /socket.io/1/websocket/JMMn1I8aiOMGCMPOhC11
debug - set heartbeat interval for client JMMn1I8aiOMGCMPOhC11
debug - client authorized for
debug - websocket writing 1::
1>
3
{"moda":{}}
2>moda:instancea
2>moda:instanceb
2>modb:instancea

最佳答案

问题来自于 forEachSeries 需要一个额外的回调作为第三个参数(在整个处理完成时调用)。您不能只在 forEachSeries 之后放置一些代码,希望它在完成后被调用。

这是您修改后的代码:

var response = {};
async.series([

function (callback) {
console.log('1>');
redis.smembers('modules', function (err, modules) {
async.forEachSeries(modules, function(module, moduleCallback) {
response[module] = {}

redis.smembers(module + ':instances', function(err, instances) {
async.forEachSeries(instances, function(instance, instanceCallback) {
response[module][instance] = {}
console.log('2>' + module + ':' +instance);
instanceCallback();
}, moduleCallback );
});
}, callback );
});
},
function (callback) {
console.log('3');
callback();
}],
function() {
console.log(JSON.stringify(response));
});

请注意回调和 moduleCallback 是如何用作第三个参数的。输出是:

1>
2>moda:instancea
2>moda:instanceb
2>modb:instancea
3
{"moda":{"instancea":{},"instanceb":{}},"modb":{"instancea":{}}}

我想这正是您所期望的。

补充说明:forEachSeries会依次处理所有的事情,下一个操作等待上一个操作完成。这将产生大量到 Redis 的往返。 forEach 在这里应该更有效地利用流水线。

关于javascript - node.js + socket.io + 结果需要多个数据库调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12646822/

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