Node.js使用@emailjs/nodejs时出现模块找不到错误求助
解决Node.js中@emailjs/nodejs的ES模块导入错误
问题原因
错误提示找不到EmailJSResponseStatus模块,本质是Node.js的ES模块解析规则要求导入必须包含完整文件扩展名,但@emailjs/nodejs包内的mjs/index.js文件中使用了省略扩展名的导入路径(比如./models/EmailJSResponseStatus),导致Node.js无法定位到对应的.js文件。
解决方案
1. 临时修复(快速生效)
手动修改node_modules/@emailjs/nodejs/mjs/index.js中的导入语句,补充完整的.js扩展名:
// 修改前 import { EmailJSResponseStatus } from './models/EmailJSResponseStatus'; import { init } from './methods/init/init'; import { send } from './methods/send/send'; // 修改后 import { EmailJSResponseStatus } from './models/EmailJSResponseStatus.js'; import { init } from './methods/init/init.js'; import { send } from './methods/send/send.js';
注意:此修复是临时的,重新执行npm install会覆盖修改内容。
2. 改用CommonJS语法(长期稳定)
如果项目允许切换模块系统,将ES模块语法改为CommonJS:
- 修改
emailService.js的导入方式:
const emailjs = require("@emailjs/nodejs"); exports.sendPasswordResetEmail = async (emailData) => { try { const response = await emailjs.send( process.env.EMAIL_SERVICE_ID, process.env.EMAIL_TEMPLATE_ID, { to_email: emailData.receiver, subject: "Password Reset", template_params: { user_email: emailData.receiver, message: `Click the following link to reset your password: ${emailData.link}`, }, }, process.env.EMAIL_USER_ID ); console.log('Email sent successfully:', response); } catch (error) { console.error('Error sending email:', error); throw error; } }
- 如果你的
package.json中设置了"type": "module",可以移除该配置,或者将emailService.js重命名为emailService.cjs。
3. 反馈包问题(从根源解决)
这是@emailjs/nodejs包本身的ES模块兼容性问题,你可以:
- 前往该包的GitHub仓库提交Issue,说明Node.js ES模块需要完整文件扩展名的问题。
- 尝试降级到该包的旧版本,查看是否存在没有此问题的版本(比如查看包的release日志)。
内容的提问来源于stack exchange,提问作者Shahood Amir
相关产品推荐
相关产品推荐

