升级NestJS项目至Node.js 18后导入crypto模块显示undefined的问题咨询
Node.js 18中
crypto模块默认导入返回undefined的原因及解决方法 问题根源
Node.js的crypto属于CommonJS模块,而ES模块(ESM)导入CommonJS模块时,默认导出对应的是该模块module.exports上的default属性。但crypto模块本身并没有设置default导出,它的所有功能直接挂在module.exports对象上。Node.js 18对ES模块与CommonJS模块的交互规则执行更严格,和你2021年使用的旧版本Node.js处理逻辑存在差异,才导致直接用import crypto from 'crypto'拿到的是undefined。
替代方案
有两种可靠的解决方式:
采用命名导入的ESM语法:
import * as crypto from 'crypto';这种写法会将
crypto模块的所有导出成员挂载到crypto对象上,效果和CommonJS的const crypto = require('crypto')完全一致。直接使用CommonJS的
require语法:
如果项目允许混用CommonJS,可以保留传统写法:const crypto = require('crypto');
另外,确认下NestJS项目package.json里的type字段设置:如果是"type": "module",优先用ESM的命名导入;如果未设置或设为"commonjs",用require语法更稳妥。
内容的提问来源于stack exchange,提问作者delete
相关产品推荐
相关产品推荐

