承诺节点服务器代码
Promisifying Node Server code
基本上,我 运行 陷入节点应用程序的排序问题。我需要创建一个聊天室。
三个组成部分:1.) server.js 2.) RoomHandler.js 3.) DBService.js
当用户点击createRoom时,应该return数据库中生成的roomId。 [此操作由 2 mysql 部分组成:
query1 = insert into groupchatroom(room_name,room_description) values('test1','Test room dummy room');
query2 = select groupchatroomid from groupchatroom where room_name='test1';
只有 1 个成功,2 个才应该被解雇。
代码顺序如下
当请求到达时 server.js :
app.post('/createGroupRoom',function(req,res){
var roomData = JSON.parse(req.query.room);
var roomId=roomHandler.createGroupRoom(roomData.roomName,roomData.roomDesc);
res.json({roomNum: roomId});
});
RoomHandler 内部:
var that = this;
var p = new Promise(function(resolve,reject){
that.dbService.executeQuery(query1,resolve,reject);
});
p.then(function()
{
that.dbService.executeQuery(query2,p.resolve,p.reject);
}).then(function(resultSet){
//resultSet is always coming as undefined
if(resultSet[0] && resultSet[0].id_groupchatroom)
{
console.log("Created groupRoom "+resultSet[0].id_groupchatroom);
return resultSet[0].id_groupchatroom;
}
}).catch(function(err){}).catch(function(err){; });
DBService 内部:
DBService.prototype.executeQuery = function(query,callback,callbackerr){
console.log("Query to DB : "+query);
var that = this;
this.pool.getConnectionAsync().then(function(connection){
that.Promise.promisifyAll(connection);
connection.queryAsync(query).then(function(resultSet){
connection.release();
callback(resultSet);
}).catch(function(err){
connection.release();
callbackerr(err);
});
}).catch(function(err){
connection.release();
callbackerr(err);
});
};
我无法在 Promise 的第二个 then 链中获取第二个查询的结果集。而且它总是给出以下错误,回调不是同一个地方的函数。可能 p.resolve 不是函数。但是我不知道如何构造上面的代码。如果是Java申请,就这么简单
server.java :
roomHandler.createRoom(roomData,httpReq,httpResp);
RoomHandler.java :
public void createRoom(Room roomData, HttpRequest req, HttpResponse res)
if(dbService.executeQuery(query1))
{
rs = dbService.executeQuery(query2);
if(rs!=null)
res.end(rs.next());
}
我不确定我是否试图过度承诺这里的代码!! .但是最好从头开始对代码进行排序。任何 help/tutorial 将不胜感激。
除了承诺链中缺少 return 之外,您的代码还有几个问题,对于初学者来说,停止用承诺包装承诺:
DBService.prototype.executeQuery = function(query){
console.log("Query to DB : "+query);
var that = this, connection;
return this.pool.getConnectionAsync().then(function(_connection){
connection = that.Promise.promisifyAll(_connection);
return connection.queryAsync(query);
}).then(function(resultSet){
connection.release();
return resultSet;
}).catch(function(err){
if(connection) connection.release();
throw err;
});
}
RoomHandler 代码类似于:
var that = this;
return this.dbService.executeQuery(query1).then(function(){
return that.dbService.executeQuery(query2);
}).then(function(resultSet){
//resultSet is always coming as undefined
if(resultSet[0] && resultSet[0].id_groupchatroom)
{
console.log("Created groupRoom "+resultSet[0].id_groupchatroom);
return resultSet[0].id_groupchatroom;
}
}).catch(function(err){});
编辑:
你的 server.js 会是这样的:
app.post('/createGroupRoom',function(req,res){
var roomData = JSON.parse(req.query.room);
roomHandler.createGroupRoom(roomData.roomName,roomData.roomDesc)
.then(function(roomId){
res.json({roomNum: roomId})
});
});
基本上,我 运行 陷入节点应用程序的排序问题。我需要创建一个聊天室。 三个组成部分:1.) server.js 2.) RoomHandler.js 3.) DBService.js
当用户点击createRoom时,应该return数据库中生成的roomId。 [此操作由 2 mysql 部分组成:
query1 = insert into groupchatroom(room_name,room_description) values('test1','Test room dummy room');
query2 = select groupchatroomid from groupchatroom where room_name='test1';
只有 1 个成功,2 个才应该被解雇。
代码顺序如下
当请求到达时 server.js :
app.post('/createGroupRoom',function(req,res){
var roomData = JSON.parse(req.query.room);
var roomId=roomHandler.createGroupRoom(roomData.roomName,roomData.roomDesc);
res.json({roomNum: roomId});
});
RoomHandler 内部:
var that = this;
var p = new Promise(function(resolve,reject){
that.dbService.executeQuery(query1,resolve,reject);
});
p.then(function()
{
that.dbService.executeQuery(query2,p.resolve,p.reject);
}).then(function(resultSet){
//resultSet is always coming as undefined
if(resultSet[0] && resultSet[0].id_groupchatroom)
{
console.log("Created groupRoom "+resultSet[0].id_groupchatroom);
return resultSet[0].id_groupchatroom;
}
}).catch(function(err){}).catch(function(err){; });
DBService 内部:
DBService.prototype.executeQuery = function(query,callback,callbackerr){
console.log("Query to DB : "+query);
var that = this;
this.pool.getConnectionAsync().then(function(connection){
that.Promise.promisifyAll(connection);
connection.queryAsync(query).then(function(resultSet){
connection.release();
callback(resultSet);
}).catch(function(err){
connection.release();
callbackerr(err);
});
}).catch(function(err){
connection.release();
callbackerr(err);
});
};
我无法在 Promise 的第二个 then 链中获取第二个查询的结果集。而且它总是给出以下错误,回调不是同一个地方的函数。可能 p.resolve 不是函数。但是我不知道如何构造上面的代码。如果是Java申请,就这么简单
server.java :
roomHandler.createRoom(roomData,httpReq,httpResp);
RoomHandler.java :
public void createRoom(Room roomData, HttpRequest req, HttpResponse res)
if(dbService.executeQuery(query1))
{
rs = dbService.executeQuery(query2);
if(rs!=null)
res.end(rs.next());
}
我不确定我是否试图过度承诺这里的代码!! .但是最好从头开始对代码进行排序。任何 help/tutorial 将不胜感激。
除了承诺链中缺少 return 之外,您的代码还有几个问题,对于初学者来说,停止用承诺包装承诺:
DBService.prototype.executeQuery = function(query){
console.log("Query to DB : "+query);
var that = this, connection;
return this.pool.getConnectionAsync().then(function(_connection){
connection = that.Promise.promisifyAll(_connection);
return connection.queryAsync(query);
}).then(function(resultSet){
connection.release();
return resultSet;
}).catch(function(err){
if(connection) connection.release();
throw err;
});
}
RoomHandler 代码类似于:
var that = this;
return this.dbService.executeQuery(query1).then(function(){
return that.dbService.executeQuery(query2);
}).then(function(resultSet){
//resultSet is always coming as undefined
if(resultSet[0] && resultSet[0].id_groupchatroom)
{
console.log("Created groupRoom "+resultSet[0].id_groupchatroom);
return resultSet[0].id_groupchatroom;
}
}).catch(function(err){});
编辑:
你的 server.js 会是这样的:
app.post('/createGroupRoom',function(req,res){
var roomData = JSON.parse(req.query.room);
roomHandler.createGroupRoom(roomData.roomName,roomData.roomDesc)
.then(function(roomId){
res.json({roomNum: roomId})
});
});