javascript - 在将我的应用程序构建到 Heroku 但在我的机器上工作时,可选的链接运算符会给出 SyntaxError
问题描述
我在我的应用程序中使用了可选的链接运算符,例如:
object?.optionalField && this.doSomething(object.optionalField)
(检查是否optionalField
存在,然后对其进行处理)
上面的代码在我的机器上运行良好,但是当我尝试在 Heroku 上构建这个代码时它给了我一个错误。以下是日志的内容:
2020-08-06T06:39:09.697171+00:00 app[web.1]: > node app.js
2020-08-06T06:39:09.697171+00:00 app[web.1]:
2020-08-06T06:39:09.760703+00:00 app[web.1]: (node:23) ExperimentalWarning: The ESM module loader is experimental.
2020-08-06T06:39:09.905459+00:00 app[web.1]: file:///app/domain/roots/User.js:49
2020-08-06T06:39:09.905462+00:00 app[web.1]: changes?.biography && this.setBiography(changes.biography)
2020-08-06T06:39:09.905462+00:00 app[web.1]: ^
2020-08-06T06:39:09.905463+00:00 app[web.1]:
2020-08-06T06:39:09.905463+00:00 app[web.1]: SyntaxError: Unexpected token '.'
2020-08-06T06:39:09.905464+00:00 app[web.1]: at Loader.moduleStrategy (internal/modules/esm/translators.js:122:18)
2020-08-06T06:39:09.915755+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2020-08-06T06:39:09.917824+00:00 app[web.1]: npm ERR! errno 1
2020-08-06T06:39:09.920740+00:00 app[web.1]: npm ERR! ca-mongoose@1.0.0 start: `node app.js`
2020-08-06T06:39:09.920870+00:00 app[web.1]: npm ERR! Exit status 1
2020-08-06T06:39:09.920998+00:00 app[web.1]: npm ERR!
2020-08-06T06:39:09.921159+00:00 app[web.1]: npm ERR! Failed at the ca-mongoose@1.0.0 start script.
2020-08-06T06:39:09.921732+00:00 app[web.1]: npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
2020-08-06T06:39:09.933019+00:00 app[web.1]:
2020-08-06T06:39:09.933279+00:00 app[web.1]: npm ERR! A complete log of this run can be found in:
2020-08-06T06:39:09.933437+00:00 app[web.1]: npm ERR! /app/.npm/_logs/2020-08-06T06_39_09_923Z-debug.log
有谁知道这是为什么?我怀疑我应该先使用 Babel 编译代码,然后部署到 Heroku?它甚至与Babel有关吗?
解决方案
有谁知道这是为什么?
在本地,您正在使用支持可选链接运算符的最新版本的 Node.js。显然 Heroku 使用的是旧版本的 Node.js。(可选链是相当新的。)
我怀疑我应该先使用 Babel 编译代码,然后部署到 Heroku?它甚至与Babel有关吗?
这是一种选择。我们可以看出 Heroku 使用的版本是 < v14,因为“ExperimentalWarning:ESM 模块加载器是实验性的”。根据insivika指出的这个文档,您可以告诉 Heroku 在 的部分中使用什么版本,例如:engines
package.json
{
"engines": {
"node": "14.x"
}
}
该文档说默认是当前的 LTS 版本(在撰写本文时 [07/Oct/2020],即 v12.x)。
或者,如果这是您使用可选链接的唯一地方,您可以使用
object && object.optionalField && this.doSomething(object.optionalField);
或者最好
if (object && object.optionalField) {
this.doSomething(object.optionalField);
}
;-)
推荐阅读
- c# - 当我点击逃生时,暂停菜单不会激活
- python - 如何在字典 python 中使用 */+- 等运算符和字符串?
- javascript - Select2 多个值(标签)
- java - 如何解决有关环境变量的启动 PyCharm 的错误不指向有效的 JVM 安装?
- android - Editext 出现时隐藏在键盘后面
- laravel - “.../storage/logs”中没有现有目录,无法创建:只读文件系统
- javascript - 我如何对本机清理功能做出反应?
- c++ - 如何显示我输入到文本文件中的所有数据?
- android - 将数据从 StatelessWidget 传递到 StatefulWidget
- javascript - 如何在 JavaScript 中删除撇号?