You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:55:20