将bluebird替换为node.js native promises会破坏Promise.reject

将bluebird替换为node.js native promises会破坏Promise.reject,node.js,promise,bluebird,Node.js,Promise,Bluebird,当我使用bluebird promises时,以下代码工作得非常好: import * as Promise from 'bluebird'; getAccount(id) { var account = find(accounts, ['id', id]); return account ? Promise.resolve(account) : Promise.reject(new NotFoundError()); } NotFoundEr

当我使用bluebird promises时,以下代码工作得非常好:

import * as Promise from 'bluebird';

getAccount(id) {
    var account = find(accounts, ['id', id]);
    return account ?
        Promise.resolve(account) :
        Promise.reject(new NotFoundError());
}
NotFoundError
的定义如下:

export function NotFoundError(message = 'Not Found') {
    this.name = 'NotFoundError';
    this.message = message;
    this.stack = (new Error()).stack;
}
NotFoundError.prototype = Object.create(Error.prototype);
NotFoundError.prototype.constructor = NotFoundError;
但是,如果我在
getAccount()
中删除bluebird的导入,并让node.js接管承诺,则代码在
NotFoundError()
构造函数中失败,因为
未定义此
。具体来说,构造函数被调用两次,一次是从上面显示的
getAccount()
代码正确调用,第二次是由node.js的
\u tickCallback()
函数调用,其中
this
未定义:

NotFoundError (errors.js:13)
runMicrotasksCallback (internal/proces…ext_tick.js:58)
_combinedTickCallback (internal/proces…ext_tick.js:67)
_tickCallback (internal/proces…ext_tick.js:98)
为什么node.js第二次调用
NotFoundError()
构造函数,而且调用得太不正确了

请帮助。

问题是由以下原因引起的:

本机承诺没有将特定错误类传递给
catch
方法的选项,因此发生错误时,调用
NotFoundError
(前面没有
new
),因为假定它是catch处理程序。

问题是由以下原因引起的:


本机承诺没有将特定错误类传递给
catch
方法的选项,因此发生错误时,调用
NotFoundError
(前面没有
new
)因为它被假定为catch处理程序。

我无法使用您发布的代码使用Node v8进行复制。我在Node v6.9.5上。我可以尝试使用v8,但我们还没有移动到该版本。我也无法使用NodeV6进行复制。你能创建一个吗?是的,是创建MCVE的时候了。@robertklep,当我创建MCVE时,下面是我正在处理的示例:。README.md显示了如何运行测试。上一个测试在我导入bluebird时再现了问题。我无法使用您发布的代码在节点v8上再现问题。我在节点v6.9.5上。我可以尝试使用v8,但我们还没有移动到该版本。我也无法使用NodeV6进行复制。你能创建一个吗?是的,是创建MCVE的时候了。@robertklep,当我创建MCVE时,下面是我正在处理的示例:。README.md显示了如何运行测试。上一次测试在我取出进口的蓝鸟时重现了这个问题。哇!我不知道。是否有其他方法可以做到这一点?唯一的方法是使用一个
catch
处理程序并检查错误类型以确定要采取的操作。非常感谢,@roberklep。你太棒了!哇!我不知道。是否有其他方法可以做到这一点?唯一的方法是使用一个
catch
处理程序并检查错误类型以确定要采取的操作。非常感谢,@roberklep。你太棒了!
.catch(NotFoundError, function() { ... })