为什么我会得到"未定义承诺".Node v5.7.0上的错误

13 node.js postcss

我使用autoprefixerpostcss和移动到一个新的Linux服务器后,一定是错的,但我不知道这可能是什么.我收到错误:

/home/ec2-user/Enviziion/Muveoo/Server/node_modules/postcss/lib/lazy-result.js:157
        this.processing = new Promise(function (resolve, reject) {
                              ^
ReferenceError: Promise is not defined
Run Code Online (Sandbox Code Playgroud)

由以下内容触发:

var autoprefixer = require('autoprefixer');
var postCSS = require('postcss');

function prefix(css, res, type, fullPath) {
    postCSS([autoprefixer]).process(css).then(function(result) {
        var css = result.css;
        var length = css.length;
        res.writeHead(200, {
            'Content-Length' : length,
            'Content-Type' : type
        });
        res.write(css);
        res.end();
    });
}
Run Code Online (Sandbox Code Playgroud)

我研究了这个问题但是问题的所有出现似乎都是针对node.js的极早期版本,例如:

解决方案似乎总是"更新节点".

但我的似乎是最新的:

[ec2-user@ip-172-31-22-79 Server]$ node -v
v5.7.0
Run Code Online (Sandbox Code Playgroud)

我的问题可能在这里?

小智 18

我无法回答为什么会发生这种情况,但在重新安装所有npm软件包之后,我仍然遇到了同样的错误,所以我使用这个非常古老的解决方案将"monkeypatch"Promises转换为节点:

npm install es6-promise
Run Code Online (Sandbox Code Playgroud)

然后添加代码:

var Promise = require('es6-promise').Promise;
Run Code Online (Sandbox Code Playgroud)

而那"解决"了这个问题.

编辑(一年后):人们仍在对这个答案进行投票,所以我只想指出任何遇到这个问题的人,这个问题已经得到了大量的观点,而且考虑到它有多奇怪,似乎是一个常见的问题 - 扣除我后来提出的唯一合理的解释是我的一个库(也许很多库做同样的事情)在promises引入之前构建,手动实现它们并在Node被更新以正式支持promise时引起冲突.

您可能出于某种原因(有时需要避免维护旧服务器)运行旧版本的维护库,或者运行不再维护的旧库的当前版本.无论哪种方式,这个解决方案似乎都有效.