【问题标题】:Promisifying Node Server code有前途的节点服务器代码
【发布时间】:2016-08-31 22:25:57
【问题描述】:

基本上,我的节点应用程序遇到了排序问题。我有创建聊天室的要求。 三个组件:1.) server.js 2.) RoomHandler.js 3.) DBService.js

当用户点击 createRoom 时,它应该返回数据库中生成的 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());         

 }  

我不确定我是否试图在这里过度承诺代码! .但最好从一开始就对代码进行排序。任何帮助/教程将不胜感激。

【问题讨论】:

  • that.dbService.e.. 中缺少返回

标签: mysql node.js express promise bluebird


【解决方案1】:

除了承诺链中缺少返回之外,您的代码还有几个问题,对于初学者来说,停止用承诺包装承诺:

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

【讨论】:

  • 所以,假设我们必须执行多个查询,我想我们可以像你上面提到的那样继续“然后”。您提到的 roomHandler 的代码必须在 server.js 中的 promise 中或正确的地方调用?...因为如果我不将您编写的 roomHandler 代码包装在 server.js 中的 promise 中,它将在响应中发送 undefined (因为 Node\javascript 是基于回合的)............我理解你的链接返回点。如果我在 server.js 的承诺中包含您的 roomHandler 代码......谁会调用 resolve ? ...对不起,我的无知。
  • 那么,根本不需要创建 Promise 吗?还有一个疑问:roomHandler 代码返回 id_groupchatroom (or) Promise ??
  • 它返回解析为聊天室 id 的承诺
  • 谢谢。我希望以下代码更改不会对您提供的上述 3 个 sn-ps 产生任何影响。 var tobeReturned = this.XXXXXXX.then().then().......catch().catch()...... ;返回被返回;另外......在很多地方看起来,而不是返回布尔值、字符串等原始值,......我们必须用 Promise.resolve(rawValue); 替换它
猜你喜欢
  • 1970-01-01
  • 2015-07-12
  • 2019-02-03
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 2021-02-07
相关资源
最近更新 更多