Express+json-server认证API:创建用户后nodemailer无法发送验证邮件
问题分析与解决建议
核心问题定位
你遇到的情况大概率是创建用户的Api.post请求抛出了未被捕获的错误,导致代码终止执行,无法走到后续的邮件发送逻辑。因为删除该行或调换顺序后邮件能正常发送,说明邮件发送本身是正常的,问题出在用户创建步骤的异常未被处理。
具体排查与解决步骤
1. 为用户创建代码添加错误捕获
在await Api.post外层包裹try/catch,捕获并打印错误,确认是否是创建用户时出错:
// 创建新用户 const newUser: User = { id: uuidv4(), email: user.email, name: String(user.name), passwordHash: await bcrypt.hash(String(user.password), 10), }; try { await Api.post(USERS_URL, newUser); console.log('用户创建成功,进入邮件发送流程'); // 确认是否执行到这里 } catch (apiError) { console.error('创建用户失败详情:', apiError); return res.status(INTERNAL_SERVER_ERROR).send('用户创建失败'); } // 发送验证链接 const emailToken = Auth.generateToken(user.email); const message = `Click the link below to verify your email\nhttp://localhost:4000/verifyEmail/${newUser.id}/${emailToken}`; try { await Email.send(user.email, 'Verify your email', message); } catch (error) { return res.status(INTERNAL_SERVER_ERROR).send('Email not sent'); } return res.status(OK).send('Email sent');
2. 验证json-server的可用性与请求合法性
- 确认json-server服务正在
http://localhost:3001运行,可通过浏览器访问http://localhost:3001查看是否正常响应。 - 手动测试POST请求:用Postman或curl发送请求到
http://localhost:3001${USERS_URL},携带newUser的JSON数据,检查是否能成功创建用户,以及返回的状态码是否为201(创建成功)。 - 检查
newUser的结构是否符合json-server的要求:比如是否有重复的id(uuidv4理论上唯一,但可确认数据库中已有数据)、字段是否符合预期。
3. 检查Axios请求的异常处理
你的Api.post方法中,Axios默认仅在响应状态码为2xx时resolve,若json-server返回4xx/5xx错误(比如重复id导致409冲突),Axios会直接抛出错误,而你的原代码未处理该错误,导致后续代码无法执行。
4. 额外排查点
- 确认
bcrypt.hash未抛出错误:虽然调换顺序后邮件能发送,但可添加console.log输出passwordHash的值,确认哈希过程正常。 - 检查nodemailer的连接状态:在邮件发送前添加console.log,确认走到邮件发送逻辑时,nodemailer的transporter是否正常。
总结
最可能的原因是用户创建请求出现了未被捕获的异常,导致代码终止。通过添加错误捕获并排查json-server的请求合法性,即可定位并解决问题。
内容的提问来源于stack exchange,提问作者BuYYan
相关产品推荐
相关产品推荐

