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

Express请求无Accept-Language头时如何避免触发500错误

问题根因

  1. 初始版本报错原因:当请求未携带Accept-Language头时,accepts(req).languages()会返回空数组而非抛出异常,你在空数组上取[0]得到undefined,调用split()方法会抛出TypeError,而初始版本的catch块为空,没有捕获处理错误,异常被外层的catchAsyncErrors工具捕获后触发全局500错误。
  2. 修改后版本仍报错的原因:空数组场景不会触发第一个try...catch,直接进入第二个try块执行langs[0].split(),即使第二个catch触发赋值默认值,如果你后续逻辑存在对lang取值的校验规则,也可能因为前面的异常链路触发意外错误。

修复代码

// index.js - 最终修复版本
utils.catchAsyncErrors(async (req, res) => {
  let lang = req.params.lang
  if (!lang) {
    try {
      const langs = accepts(req).languages()
      // 先校验语言数组非空再处理
      if (Array.isArray(langs) && langs.length > 0) {
        lang = langs[0].split('-')[0].toLowerCase()
      } else {
        // 无语言头直接用默认英文
        lang = 'en'
      }
    } catch (err) {
      // 所有异常场景都降级到默认英文
      lang = 'en'
    }
  }
  // 此处保留你后续的原有业务逻辑
})

该方案可以同时满足你的两个需求:

  • 携带合法Accept-Language头的请求可以正常解析语言,执行对应逻辑
  • 未携带语言头、语言头格式异常、accepts调用异常的场景都会自动降级为英文,不会抛出500错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:45:04