2016-05-06 2 views
0

基本的に私のノードアプリケーションのシーケンシングの問題が発生しています。私はチャットルームを作成する必要があります。 3つのコンポーネント:1.)server.js 2.)RoomHandler.js 3. DBService.jsノードサーバコードの承認

ユーザーがcreateRoomをクリックすると、データベースで生成されたroomIdが返されます。 [この操作は、2つのmysqlパーツで構成されています。

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の2番目のチェーンで2番目のクエリのresultSetを取得できません。また、常に次のエラーを返します。コールバックは同じ場所の関数ではありません。 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());   

} 

私はこっちのコードをpromisifyしようとしているかどうかわかりません!しかし、コードを最初から順番に並べるほうが良い。どんなヘルプ/チュートリアルも感謝します。

+0

'that.dbService.e..'の返り値がありません – mido

答えて

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

これで、複数のクエリを実行する必要があるとします。上記のように" then "を続けることができます。あなたが言及したroomHandlerのコードは、server.jsまたはどこかで約束の中で呼び出されなければならないでしょうか?..もしあなたがserver.jsの約束の範囲内で書いたroomHandlerコードをラップしないなら、 (Node \ javascriptはターンベースなので)...........私はあなたの連鎖返りのポイントを理解しました。 server.jsの約束内にroomHandlerコードを含めると、誰が解決を呼びますか? ...無知になって申し訳ありません。 –

+0

@SrikanthPai updated ... – mido

+0

プロミスを作成する必要はありませんか?またもう1つの疑問:roomHandlerコードはid_groupchatroom(または)Promiseを返します?? –