You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express异步POST请求遇[DEP0013]弃用警告,求解决方案

解决 [DEP0013] DeprecationWarning: Calling an asynchronous function without callback is deprecated

咱们先拆解这个警告的根源:这个提示是Node.js在提醒你,你调用了一个基于回调的传统异步函数,但用法不符合规范——要么没传必要的回调参数,要么在async函数里错误地混用了回调和await逻辑。

针对你的代码场景,我给你两个关键解决方案:


1. 改用bcrypt的Promise版本(推荐方案)

你原来的代码里,bcrypt.hash用了回调形式,但同时加了await——但这个版本的bcrypt.hash并不返回Promise,await在这里完全无效,反而会让Node.js检测到不规范的异步调用触发警告。

bcrypt本身支持Promise写法,直接用await配合无回调的bcrypt.hash即可,代码更简洁规范:

app.post('/login', async (req, res) => { 
  try {
    // 解析请求参数
    const mail = decodeURIComponent(req.body.mail);
    const password = decodeURIComponent(req.body.password);
    
    // 用Promise版本的bcrypt.hash,直接await等待结果
    const hash = await bcrypt.hash(password, saltRounds);
    
    // 这里写哈希后的业务逻辑,比如验证用户、存储哈希值等
    res.json({ success: true });
  } catch (err) {
    // 必须捕获异步过程中的错误,避免服务器崩溃
    console.error('哈希生成失败:', err);
    res.status(500).json({ success: false, message: '服务器内部错误' });
  }
});

这么改之后,既符合async/await的异步编程范式,也彻底避开了回调带来的警告问题。


2. 关于最简路由也触发警告的排查

你提到即使写了最简化的路由:

app.post('/login', async (req, res) => { res.json({ success: true }); });

还是会触发警告,这个代码本身是完全合规的——Express从v4.16.0开始就原生支持async函数作为路由处理器。

出现这种情况大概率是以下两个原因:

  • Node.js版本过低:比如v10及更早的版本,对async函数的处理和现代版本有差异,建议升级到LTS版本(比如v16+)
  • 其他代码/中间件的问题:警告不一定来自这个路由本身,检查一下项目里其他地方有没有调用类似fs.readFile、child_process.exec这类传统异步函数但没传回调的情况

额外提醒

在Express的async路由处理器里,一定要用try/catch捕获错误——如果异步过程中抛出异常但没被捕获,会导致Promise拒绝,进而让Node.js进程崩溃。用try/catch包裹所有异步逻辑,能优雅地处理错误并给客户端返回合适的响应。

内容的提问来源于stack exchange,提问作者Lukas Gund

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:01:14