为什么我会在Node v5.7.0上得到一个“Promise is not defined。”的错误

我使用autoprefixer postcss和移动到一个新的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 

这是由以下几点触发的

 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(); }); } 

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

  • 本地支持Node.js中的承诺

  • https://github.com/postcss/postcss-nested/issues/30

而解决scheme似乎总是“更新节点”。

但我的似乎是最新的:

 [ec2-user@ip-172-31-22-79 Server]$ node -v v5.7.0 

我的问题可能在这里?

我不能回答为什么发生这种情况,但重新安装所有的npm包后,我仍然有同样的错误,所以我用这个非常古老的解决scheme“把monkeyspatch”诺言到节点:

 npm install es6-promise 

然后添加代码:

 var Promise = require('es6-promise').Promise; 

那“解决”了这个问题。

编辑(一年之后):人们仍然对这个答案投票,所以我只想指出任何遇到这个问题的人,这个问题已经得到了很多的意见,似乎是一个普遍的问题,考虑它是多么奇怪 – 扣除我后来提出的唯一合理的解释是,在承诺之前构build的我的一个库(也许许多库也是这样做的)引入了它们,并且在Node被更新为正式支持承诺时手动实现并导致冲突。

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

将节点升级到最新版本(v4.5.0)确实解决了这个问题。