繁体   English   中英

如何在 Node 16 应用程序中使用命名模块导出?

[英]How Can I Use Named Module Exports in Node 16 App?

我正在使用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. 这个答案通过npm i esm
  3. 使用nodemon --experimental-modules app.js

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

知道我做错了什么吗?

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

默认情况下,节点将每个 javascript 文件视为CommonJS 模块,但在package.json文件中具有以下内容

"type": "module"

您告诉节点将每个 javascript 文件视为Ecmascript 模块,但在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";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM