Nodejs 承诺 catch "hell" 然后使用 sequelize orm
Nodejs promises catch "hell" then using sequelize orm
目前我正在使用流行的 sequelize orm 和 typesciprt 为 nodejs 开发网络应用程序。这是我的代码中的一个例子
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。我想在我的 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 块,否则如果我收到未处理的拒绝 SequelizeDatabaseError 或任何其他未处理的拒绝,nodejs 将停止工作。为什么在使用 sequalize 调用 db 时,我不能在我的 expressjs 路由器中只使用一个 catch 块,就像我的第一个例子一样?
Sequelize 操作 return 承诺,因此没有理由将 Q 加入其中。这相当于
private getBestScore(idPlayer: number): Q.Promise<number> {
return GameModel.max<number>('score', { where: { 'idPlayer': idPlayer } });
}
它不是 return 和 Q.Promise
(sequelize 使用 bluebird),但实现应该是可互操作的,因为它们都是 'thenables'。
目前我正在使用流行的 sequelize orm 和 typesciprt 为 nodejs 开发网络应用程序。这是我的代码中的一个例子
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。我想在我的 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 块,否则如果我收到未处理的拒绝 SequelizeDatabaseError 或任何其他未处理的拒绝,nodejs 将停止工作。为什么在使用 sequalize 调用 db 时,我不能在我的 expressjs 路由器中只使用一个 catch 块,就像我的第一个例子一样?
Sequelize 操作 return 承诺,因此没有理由将 Q 加入其中。这相当于
private getBestScore(idPlayer: number): Q.Promise<number> {
return GameModel.max<number>('score', { where: { 'idPlayer': idPlayer } });
}
它不是 return 和 Q.Promise
(sequelize 使用 bluebird),但实现应该是可互操作的,因为它们都是 'thenables'。