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'。