javascript - 可选的链接运算符在将我的应用程序构建到 Heroku 时给出 SyntaxError 但在我的机器上工作

标签 javascript node.js heroku babeljs

我在应用程序中使用可选链接运算符,例如:

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! <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b5d6d498d8dadbd2dadac6d0f5849b859b85" rel="noreferrer noopener nofollow">[email protected]</a> 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 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="395a58145456575e56564a5c790817091709" rel="noreferrer noopener nofollow">[email protected]</a> 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?它甚至与巴别塔有关吗?

最佳答案

Does anyone know why is that?

在本地,您使用的是支持可选链接运算符的最新版本的 Node.js。显然 Heroku 使用的是旧版本的 Node.js,但事实并非如此。 (可选链是相当新的。)

I suspect I should compile the code first using Babel and then deploy to Heroku? Is it even related to Babel?

这是一种选择。我们可以看出 Heroku 使用的版本 < v14,因为“实验警告:ESM 模块加载器是实验性的”。根据this documentationinsivika指出,您可以在 package.jsonengines 部分告诉 Heroku 使用哪个版本,例如:

{
  "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);
}

;-)

关于javascript - 可选的链接运算符在将我的应用程序构建到 Heroku 时给出 SyntaxError 但在我的机器上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63278161/

相关文章:

javascript - 在函数内将日期格式化为人类可读的格式

javascript - 像 PowerPivot 表一样使用 sap.ui.table.Table

macos - NPM 的问题

javascript - 排除 Rails 部署的 Heroku ExecJS 程序错误

ruby-on-rails - 我的 application.js 无法工作并且 application.css 无法在 Rails 中更新

javascript - 我需要下拉列表的选项卡悬停在下面的示例中,而不是单击

javascript - 保存 html 页面 + 更改所有链接以指向正确的位置

javascript - 当我在 Node 中 console.log 时,req.body 会显示密码

javascript - 为什么 setTimeout 触发的时间早于应有的时间?

java - 为什么 Quartz Scheduler 在 x 分钟后停止在 Heroku 上工作?