我有一个Node.js/Express应用程序,用于查询路径中的MySQL数据库并将结果显示给用户.我的问题是如何在将用户重定向到他们请求的页面之前完成两个查询之前运行查询并阻止?
在我的示例中,我有2个查询需要在呈现页面之前完成.如果我在查询1的"结果"回调中嵌套查询2,我可以使查询同步运行.但是当查询数量增加时,这将变得非常复杂.
如何同步运行多个(在本例中为2个)数据库查询而不将后续查询嵌套在先前查询的"结果"回调中?
我已经查看了Node模块中的'Flow control/Async goodies',并尝试了flow-js,但我无法使用异步查询.
下面列出了我试图从'/ home'路由执行的2个查询.节点专家能否解释"正确"的方法.
app.get('/home', function (req,res) {
var user_array = [];
var title_array = [];
// first query
var sql = 'select user_name from users';
db.execute(sql)
.addListener('row', function(r) {
user_array.push( { user_name: r.user_name } );
})
.addListener('result', function(r) {
req.session.user_array = user_array;
});
// second query
var sql = 'select title from code_samples';
db.execute(sql)
.addListener('row', function(r) {
title_array.push( { title: r.title } );
})
.addListener('result', function(r) {
req.session.title_array = title_array;
});
// because the queries …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Socket.io v.7中的新"房间"功能来创建动态聊天室,但我在我的示例中遇到静态房间问题.根据用户选择的URL,他们应该在room1或room2中结束.用户在聊天中输入的任何内容都应该广播给同一房间内的用户.我有2个浏览器(chrome&ff),每个浏览器都有一个打开到/ room1和/ room2的标签,但我输入的内容似乎没有广播到其他标签.我究竟做错了什么?
服务器代码
var app = require('express').createServer();
var io = require("socket.io").listen(app);
io.sockets.on('connection', function (socket) {
// join to room and save the room name
socket.on('join room', function (room) {
socket.set('room', room, function() { console.log('room ' + room + ' saved'); } );
socket.join(room);
})
socket.on('message', function(data) {
console.log("Client data: " + data);
// lookup room and broadcast to that room
socket.get('room', function(err, room) {
//room example - https://github.com/learnboost/socket.io
// neither method works for me
socket.broadcast.to(room).emit('new fan');
io.sockets.in(room).emit('new non-fan'); …Run Code Online (Sandbox Code Playgroud)