node-formidable / formidable

The most used, flexible, fast and streaming parser for multipart form data. Supports uploading to serverless environments, AWS S3, Azure, GCP or the filesystem. Used in production.
MIT License
7k stars 680 forks source link

ERR_REQUIRE_ESM #864

Closed wdamaral closed 2 years ago

wdamaral commented 2 years ago

Hey folks, I'm playing around with formidable. More like learning its details than anything, as I'm fairly new to Typescript.

I'm facing with an issue that might be a bug or some sort of incompatibility that I can't figure out the reason. Am I doing something wrong here?

The error states:

C:\Users\wfura\Documents\Projects\formidable\node_modules\ts-node\dist\index.js:842 return old(m, filename); ^ Error [ERR_REQUIRE_ESM]: require() of ES Module C:\Users\wfura\Documents\Projects\formidable\node_modules\formidable\src\index.js from C:\Users\wfura\Documents\Projects\formidable\src\app.ts not supported. Instead change the require of index.js in C:\Users\wfura\Documents\Projects\formidable\src\app.ts to a dynamic import() which is available in all CommonJS modules. at require.extensions. [as .js] (C:\Users\wfura\Documents\Projects\formidable\node_modules\ts-node\dist\index.js:842:20) at Object. (C:\Users\wfura\Documents\Projects\formidable\src\app.ts:7:38) at m._compile (C:\Users\wfura\Documents\Projects\formidable\node_modules\ts-node\dist\index.js:848:29) at require.extensions. [as .ts] (C:\Users\wfura\Documents\Projects\formidable\node_modules\ts-node\dist\index.js:850:16) at phase4 (C:\Users\wfura\Documents\Projects\formidable\node_modules\ts-node\dist\bin.js:414:16) at bootstrap (C:\Users\wfura\Documents\Projects\formidable\node_modules\ts-node\dist\bin.js:49:12) at main (C:\Users\wfura\Documents\Projects\formidable\node_modules\ts-node\dist\bin.js:32:12) at Object. (C:\Users\wfura\Documents\Projects\formidable\node_modules\ts-node\dist\bin.js:526:5) { code: 'ERR_REQUIRE_ESM' }

I only have formidable on this project with express. My package.json is as below.

{
  "name": "formidable",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "nodemon ./src/app.ts"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.18.1",
    "formidable": "^3.2.4"
  },
  "devDependencies": {
    "@types/express": "^4.17.13",
    "@types/formidable": "^2.0.5",
    "@types/node": "^17.0.41",
    "nodemon": "^2.0.16",
    "ts-node": "^10.8.1",
    "typescript": "^4.7.3"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "target": "ES6",
    "module": "commonjs",
    "outDir": "./dist",
    "rootDir": "./src",
    "esModuleInterop": true
  }
}

Finally, the single file in this project.

import express from "express";
import formidable from "formidable";

const app: express.Application = express();

app.post("/file-upload", (req, res, next) => {
  const form = formidable({});
  console.log(req);
  form.parse(req);

  form.on("fileBegin", (name, file) => {
      console.log(file)
  });

  form.on("file", (name, file) => {
      console.log(name)
  });

  res.sendStatus(200)
});

app.listen(3000, () => console.log("listening on 3000"));
tunnckoCore commented 2 years ago

@wdamaral hello there.

For now the v3 version is only ESM compatible (and not CJS/CommonJS, e.g. with requires), so you need to make your project accepting ES Modules. That's by adding "type": "module" in your package.json.