Express请求无Accept-Language头时如何避免触发500错误
问题根因
- 初始版本报错原因:当请求未携带
Accept-Language头时,accepts(req).languages()会返回空数组而非抛出异常,你在空数组上取[0]得到undefined,调用split()方法会抛出TypeError,而初始版本的catch块为空,没有捕获处理错误,异常被外层的catchAsyncErrors工具捕获后触发全局500错误。 - 修改后版本仍报错的原因:空数组场景不会触发第一个
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
相关产品推荐
相关产品推荐

