mysql - 有前途的 Node 服务器代码

标签 mysql node.js express promise bluebird

基本上,我的 Node 应用程序遇到了排序问题。我需要创建一个聊天室。 三个组件: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.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应用程序,就会像下面这样简单。

服务器.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());         

 }  

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

最佳答案

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

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

关于mysql - 有前途的 Node 服务器代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37062343/

相关文章:

php - 用于从对话和消息表连接中选择最新消息的 MySql 查询

mysql - 按组按 SQL 分类

javascript - 返回对 2 个 promise 的响应

node.js - 如何在 Node.js 的 VSCode 中使用附加环境变量 Debug=* 运行脚本?

node.js - Passport-facebook 获取访问 token 失败

MYSQL 更新具有连续数值 IF NULL 的列 - 连续序列

mysql - 计算另一个给定日期间隔(期间)内的日期间隔(期间)的天数

mysql - 获取 MySQL 服务器时间作为 Sequelize findOne() 查询的一部分

node.js - 如何将 webpack 与 monorepo 一起使用(yarnpkg 工作区)

node.js - 如何在 Windows 上设置 NODE_ENV=生产?