目前,我使用流行的sequelize orm和typesciprt为nodejs开发web应用程序。以下是我的代码
中的示例this.createNewGame(player.idPlayer).then((game) => {
this.getBestScore(player.idPlayer).then((bestScore) => {
defer.resolve({
idGame: game.idGame,
bestScore: bestScore
});
}).catch((error) => { defer.reject(error); });
}).catch((error) => { defer.reject(error); });
这是方法之一
private getBestScore(idPlayer: number): Q.Promise<number> {
var defer = this.q.defer<number>();
GameModel.max<number>('score', { where: { 'idPlayer': idPlayer } }).then((result) => {
defer.resolve(result);
}).catch((error) => { defer.reject(error); });
return defer.promise;
}
我在每个方法实现中使用catch,也在每次调用方法时使用catch。我想在我的expressjs路由器中只有一个catch块。我试过像这样的代码,它运行得很好,这是例子:
//code in GameService class ...
getData(): Q.Promise<number> {
var defer = this.q.defer<number>();
this.method1().then((result) => {
defer.resolve(result);
});
return defer.promise;
}
private method1(): Q.Promise<number> {
var defer = this.q.defer<number>();
throw 'some error occurs here';
return defer.promise;
}
//router call GameService
router.get('/error-test', (req: express.Request, res: express.Response) => {
gameService.getData().then((result) => {
res.json(result);
}).catch((error) => { res.send(error); });
//works fine, here I get my thrown error
});
但在我之前的例子中,我需要在任何地方使用catch块,否则如果我得到Unhandled rejection SequelizeDatabaseError或任何其他Unhandled拒绝,则nodejs停止工作。为什么在使用sequalize调用db时,我的expressjs路由器中只能使用一个catch块,就像我的第一个例子一样?
答案 0 :(得分:2)
Sequelize操作返回承诺,因此没有理由将Q置于混合中。这相当于
private getBestScore(idPlayer: number): Q.Promise<number> {
return GameModel.max<number>('score', { where: { 'idPlayer': idPlayer } });
}
它没有返回Q.Promise
(sequelize使用bluebird),但实现应该是可互操作的,因为它们都是&#39; thenables&#39;。