【问题标题】:Heroku app crashes with ERR_UNKNOWN_FILE_EXTENSIONHeroku 应用程序因 ERR_UNKNOWN_FILE_EXTENSION 而崩溃
【发布时间】:2020-08-12 05:07:28
【问题描述】:

我的应用运行了几个月,没有任何问题。

这很简单,只有:

  1. core.mjs - 主应用文件
  2. config.json - 设置文件

core.mjs 使用这一行导入设置:import config from "./config.json";

应用程序使用以下命令启动:"node --experimental-modules core.mjs"

JSON 有效。

所有文件都在各自的位置。

我可以在本地运行这个应用程序,它会工作。

但在 heroku 上部署它后,它在启动时崩溃。这是日志:

2020-04-28T10:50:37.750749+00:00 app[worker.1]: (node:4) ExperimentalWarning: The ESM module loader is experimental.
2020-04-28T10:50:37.769400+00:00 app[worker.1]: internal/modules/run_main.js:57
2020-04-28T10:50:37.769402+00:00 app[worker.1]:     internalBinding('errors').triggerUncaughtException(
2020-04-28T10:50:37.769402+00:00 app[worker.1]:                               ^
2020-04-28T10:50:37.769402+00:00 app[worker.1]: 
2020-04-28T10:50:37.769403+00:00 app[worker.1]: TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".json" for /app/config.json
2020-04-28T10:50:37.769403+00:00 app[worker.1]:     at Loader.defaultGetFormat [as _getFormat] (internal/modules/esm/get_format.js:70:15)
2020-04-28T10:50:37.769404+00:00 app[worker.1]:     at Loader.getFormat (internal/modules/esm/loader.js:110:42)
2020-04-28T10:50:37.769404+00:00 app[worker.1]:     at Loader.getModuleJob (internal/modules/esm/loader.js:241:31)
2020-04-28T10:50:37.769405+00:00 app[worker.1]:     at async ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:44:17)
2020-04-28T10:50:37.769405+00:00 app[worker.1]:     at async Promise.all (index 1)
2020-04-28T10:50:37.769406+00:00 app[worker.1]:     at async link (internal/modules/esm/module_job.js:48:9) {
2020-04-28T10:50:37.769406+00:00 app[worker.1]:   code: 'ERR_UNKNOWN_FILE_EXTENSION'
2020-04-28T10:50:37.769406+00:00 app[worker.1]: }

不使用 JSON 修复

当我尝试修复时,我只是将导入字符串和复制粘贴 json 对象注释到 core.mjs 中,例如:const config = {...}; 这有效但破坏了所有概念。

关于如何处理这个 json 导入问题的任何想法? (无数据库)

【问题讨论】:

    标签: node.js json heroku


    【解决方案1】:

    您可以做的一个简单的解决方法是将整个 JSON 文件包装在一个 JS 文件中:

    export default {
       ...json contents
    }
    

    并将您的文件从 config.json 重命名为 config.js

    然后你可以简单地使用import config from './config.js';导入它

    现在,这不是一个完美的解决方案,您只是导出一个 POJO(与 JSON 具有相同的语法),这是它起作用的唯一原因。

    也就是说,您可能会遇到无法简单进行此转换的情况,因为原始 JSON 文件可能是无法转换的配置文件(例如 package.json)。

    编辑:这个问题已经被问过了。更详细的答案可以在How to import a json file in ecmascript 6?找到。

    【讨论】:

    • 您的回答是一个不错的选择。但问题不是“如何导入 json”,因为我已经成功导入它并且它更早地工作了,如果我在本地启动我的应用程序它就可以工作。问题是在将我的应用程序部署到它停止工作的 heroku 服务器上之后(列出的日志)。
    猜你喜欢
    • 2013-02-04
    • 2018-05-22
    • 2023-03-14
    • 2019-12-26
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多