Node.js中formidable库import报错但require正常的原因咨询
问题解答
这个问题其实是CommonJS和ES模块导出机制的差异,再加上formidable包的导出设计导致的,我来给你拆解清楚:
1. CommonJS require的工作方式
当你用const formidable = require("formidable")时,require会直接返回该模块的module.exports内容。而formidable在CommonJS规范下,是把创建表单的核心函数直接赋值给了module.exports,所以你拿到的就是那个可调用的函数,自然能直接执行formidable({ multiples: true })。
2. ES模块import * as的工作方式
而用import * as formidable from "formidable"时,这种语法会把模块的所有导出项(包括默认导出、命名导出)都聚合到一个对象里,这个对象本身是不可调用的。formidable的ES模块导出中,那个可调用的核心函数其实是模块的默认导出,它会被放在这个聚合对象的default属性里。
也就是说,如果你非要用import * as的写法,得改成这样调用:
const form = formidable.default({ multiples: true });
3. 更推荐的ES模块写法
当然,更符合ES模块习惯的写法是直接使用默认导入,这样拿到的就是可调用的核心函数,和require的效果一致:
import express from "express"; import path from "path"; import fs from "fs/promises"; import formidable from "formidable"; // 默认导入 const PORT = 8000; const app = express(); app.get("/", async (req, res) => { res.sendFile(path.resolve(__dirname, "..", "public", "index.html")); }); app.post("/api/upload", (req, res, next) => { const form = formidable({ multiples: true }); // 正常调用 form.parse(req, (err: any, fields: any, files: any) => { if (err) { next(err); return; } res.json({ fields, files }); }); });
你可以自己打印一下两种导入方式的formidable值对比:用import * as时,它是一个包含default、errors等属性的对象;而默认导入时,它直接就是那个可执行的函数。
内容的提问来源于stack exchange,提问作者user8380672
相关产品推荐
相关产品推荐

