升级节点16=>20和其他库后出现ERR_REQUIRE_ESM

问题描述 投票:0回答:1

我正在尝试从版本 16 => 20 升级节点
我还决定尝试完全升级其他一些库
我尝试在升级后启动我的后端

% yarn run dev
[nodemon] 3.0.1
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): src/**/*
[nodemon] watching extensions: ts
[nodemon] starting `ts-node --transpileOnly --files src/index.ts`

不久之后

/Users/.../backend/node_modules/ts-node/dist/index.js:851
            return old(m, filename);
                   ^
Error [ERR_REQUIRE_ESM]: require() of ES Module /Users/.../backend/node_modules/file-type/index.js from /Users/.../backend/src/feature-core/upload-file.ts not supported.
Instead change the require of index.js in /Users/.../backend/src/feature-core/upload-file.ts to a dynamic import() which is available in all CommonJS modules.
    at require.extensions.<computed> [as .js] (/Users/.../backend/node_modules/ts-node/dist/index.js:851:20)

我不确定需要更新什么或如何更新,我尝试根据一些 github 问题进行一些更改,但找不到解决方案。

更新

这就是错误发生的地方:

import { protectedProcedure } from '../trpc/initialize'
import { randomString } from '../utils/rand'
import { uploadFile as uploadFileToS3 } from '../lib/s3'
import { TRPCError } from '@trpc/server'
import { fileTypeFromBuffer } from 'file-type'

export const uploadFileBase64 = protectedProcedure.input(z.object({ body: z.string() })).mutation(async ({ input }) => {
  const buffer = Buffer.from(input.body, 'base64')
  const fileType = await fileTypeFromBuffer(buffer)

  if (fileType === undefined) {
    throw new TRPCError({ code: 'BAD_REQUEST', message: 'ファイルの種類を判定できませんでした' })
  }

  const key = `${randomString()}.${fileType.ext}`
  await uploadFileToS3({
    key,
    body: buffer,
    contentType: fileType.mime,
  })

  return { key: '' }
})

我没有使用 require,无论是在这里还是在任何其他文件中,所以根据答案,我猜测我需要将

"type": "module"
添加到我的
package.json

但是添加后我得到了这个错误:

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /Users/.../backend/src/index.ts
    at new NodeError (node:internal/errors:405:5)
    at Object.getFileProtocolModuleFormat [as file:] (node:internal/modules/esm/get_format:99:9)
    at defaultGetFormat (node:internal/modules/esm/get_format:142:36)
    at defaultLoad (node:internal/modules/esm/load:91:20)
    at DefaultModuleLoader.load (node:internal/modules/esm/loader:263:26)
    at DefaultModuleLoader.moduleProvider (node:internal/modules/esm/loader:179:22)
    at new ModuleJob (node:internal/modules/esm/module_job:63:26)
    at DefaultModuleLoader.#createModuleJob (node:internal/modules/esm/loader:203:17)
    at DefaultModuleLoader.getJobFromResolveResult (node:internal/modules/esm/loader:156:34)
    at DefaultModuleLoader.getModuleJob (node:internal/modules/esm/loader:141:17) {
  code: 'ERR_UNKNOWN_FILE_EXTENSION'
}
[nodemon] app crashed - waiting for file changes before starting...

所以我猜我还缺少一些东西。

node.js reactjs typescript tsconfig
1个回答
0
投票

发生此错误是因为您正在导入的包已转换为仅限 ESM 的包(ECMAScript 模块),这意味着无法再使用 require() 导入该包。所以正如你所说,你首先升级了一些库,你必须检查它们是否不再支持 ESM 。

要解决此错误,请使用 imports/exports 而不是 require() .

不要忘记将

"type": "module"
添加到您的 package.json 文件中:.

© www.soinside.com 2019 - 2024. All rights reserved.