【问题标题】:How Can I Use Named Module Exports in Node 16 App?如何在 Node 16 应用程序中使用命名模块导出?
【发布时间】:2021-08-29 05:57:15
【问题描述】:

我正在使用 Node 16.3.0Express 4.17.1(尽管我的 Node 版本很灵活)

我有一个像这样的session.js 文件:

// session.js

exports.fetchUserId = async function(token){
  ...
}

exports.save = async function(userId){
  ...
}

然后在我的app.js 文件中,我尝试这样做:

// app.js

import session from './session.js'

我收到以下错误:

import session from './session.js'
       ^^^^^^^
SyntaxError: The requested module './session.js' does not provide an export named 'default'

...然后我想像这样在app.js 中使用session

let userId = await session.fetchUserId(req.body.token)

我尝试了以下方法,但没有任何运气:

  1. "type": "module" 添加到package.json
  2. This answer 通过做npm i esm
  3. 使用nodemon --experimental-modules app.js

我的代码在 NuxtJS 项目中使用时可以正常工作,但我正在尝试一个普通的 Node/Express 应用程序并且命名的导出不起作用。

知道我做错了什么吗?

【问题讨论】:

  • 你能分享你的package.json文件吗?具体来说,你在那个文件中有"type": "module"吗?
  • 是的,参见上面的#1。我在里面有"type": "module"
  • 不幸的是 node 默认不支持 es6 模块导入,因此您必须使用以下解决方案之一:google.com/amp/s/www.geeksforgeeks.org/… - 替代方案是使用 commonJS 导入

标签: javascript node.js express es6-modules


【解决方案1】:

您的代码中的问题是您将 ES 模块与 CommonJS 模块混合在一起。

默认情况下,节点将每个 javascript 文件视为 CommonJS module,但在 package.json 文件中包含以下内容

"type": "module"

您告诉节点将每个 javascript 文件视为 Ecmascript module,但在 session.js 文件中,您使用的是 CommonJS 模块语法来导出函数。

解决方案

您可以使用以下选项之一解决您的问题:

  • session.js 文件的扩展名更改为.cjs。 (不要忘记更改 app.js 文件中 import 语句中的扩展名)。

    将扩展名更改为.cjs 将告诉节点将session.cjs 文件视为CommonJS 模块。

  • 只需使用 ES 模块并更改 session.js 文件中的导出,如下所示:

    export const fetchUserId = async function(token){ ... }
    
    export const save = async function(userId) { ... }
    

    并将app.js文件中的导入语句更改为:

    import * as session from "./session.js";
    

【讨论】:

  • 啊,这很有道理。很好的答案,谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-11-09
  • 2019-09-14
  • 2021-06-17
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
相关资源
最近更新 更多