如何在NestJS中安装nanoid

Yar*_*riv 3 es6-modules nestjs nanoid

我尝试将 nanoid 导入 NestJS 并收到此错误:

错误 [ERR_REQUIRE_ESM]:ES 模块的 require() ....
... 而是将 ... 中的 index.js 的 require 更改为所有 CommonJS 模块中都可用的动态 import() 。

导入代码是:

import { Injectable } from '@nestjs/common';
import { nanoid } from 'nanoid';   //wont import, gives error
import { User } from './data-objects/user.object';
Run Code Online (Sandbox Code Playgroud)

我还尝试了导入语句的变体:

// I tried this alternative
import * as nanoid from 'nanoid';

// Also tried this
const nanoid = require ( 'nanoid' );
Run Code Online (Sandbox Code Playgroud)

什么都没起作用。

为什么会发生此错误以及我应该如何在 NestJS 中安装 nanoid ?

Yar*_*riv 15

通过简单的搜索,我无法找到问题的直接答案,只有在对nanoid github 问题 #365进行一些研究后才找到了答案。

关于这个问题的一些背景

  • 2022 年 6 月 8 日,nanoid Ver.4.0.0 发布,并进行了重大更改。

  • 它有一个新功能,现在仅支持 ESM 应用程序

  • 这使得它与使用 CommonJS 的应用程序不兼容。链接到更改日志...

  • Nanoid 支持团队承诺将根据需要继续支持 Ver.3.xx,直到对 Nodejs 和 Nestjs 中的 EMS 提供支持。

在 NestJS 支持 ESM 的那一天到来之前,您将不得不继续使用 nanoid 版本 3.xx

怎么修

  • 首先卸载nanoid版本4.xx:npm uninstall nanoid
  • 然后安装 ne 版本和任何其他未来的 3.xx 版本:npm install nanoid@^3.0.0

我的解决方案的来源来自 github 问题@ayushsharma82中的评论。