Node.js用ES6模块导入controller.js报无对应导出错误如何解决
ESM模块导入导出报错解决方案
问题原因
你在package.json中配置了"type": "module",项目所有JS文件默认按照ES6 Module(ESM)规范解析,但controller.js中使用的exports.xxx是CommonJS模块规范的导出语法,两种规范不兼容,因此无法识别导出内容,触发报错。
修复方案
有两种常用的修复方式,推荐选择第一种,改动最小:
方案1:默认导出方法集合(改动最小)
修改controller.js的导出逻辑,将所有接口方法整合为一个对象做默认导出,原有业务调用逻辑无需改动:
import Userdb from "../model/model.js"; export default { create: (req,res) => { // 原有业务逻辑保留 }, find: (req,res) => { // 原有业务逻辑保留 }, update: (req,res) => { // 原有业务逻辑保留 }, delete: (req,res) => { // 原有业务逻辑保留 } }
然后将index.js中的导入语句修改为默认导入即可:
// 把原来的import {controller} from ...替换成下面的写法 import controller from './server/controller/controller.js'
方案2:单个方法命名导出
每个方法单独做命名导出,全量导入后使用:
controller.js修改为:
import Userdb from "../model/model.js"; export const create = (req,res) =>{ // 原有业务逻辑保留 } export const find = (req,res) =>{ // 原有业务逻辑保留 } export const update = (req,res) =>{ // 原有业务逻辑保留 } export const delete = (req,res) =>{ // 原有业务逻辑保留 }
index.js中的导入语句修改为全量导入重命名:
import * as controller from './server/controller/controller.js'
原有调用controller.create等的代码也无需改动。
注意事项
开启"type": "module"后,所有JS文件都不能使用CommonJS语法:
- 禁止使用
require()导入模块,统一用import - 禁止使用
exports、module.exports导出内容,统一用export、export default
内容的提问来源于stack exchange,提问作者Priyanshu
相关产品推荐
相关产品推荐

