#node.js #express
Вопрос:
Я работаю над веб-сервером express(4.16.3).
Страница будет выполнять некоторые специальные действия в соответствии с языковыми настройками браузера.
Однако, если браузер (например, некоторые серверные боты) НЕ имеет Accept-Language
заголовка, это приведет к ошибке 500.
Вот оригинальная версия:
//index.js - original - would return a 500 Internal Server Error
utils.catchAsyncErrors(async (req, res) => {
let lang = req.params.lang
if (!lang) {
const langs = accepts(req).languages()
try {
lang = langs[0].split('-')[0].toLowerCase()
} catch (err) {}
}
Вот измененная версия — я использую try...catch
block, но он не может обойти ошибку.
//index.js - original - would still return a 500 Internal Server Error
utils.catchAsyncErrors(async (req, res) => {
let lang = req.params.lang
if (!lang) {
var langs;
try {
langs = accepts(req).languages();
} catch (err) {
langs = 'en';
}
try {
lang = langs[0].split('-')[0].toLowerCase()
} catch (err) {
lang = 'en';
}
}
Если я прокомментирую всю логику проверки заголовка языка, она сработает.
//index.js - original - would work fine
utils.catchAsyncErrors(async (req, res) => {
let lang = req.params.lang
if (!lang) {
/*
var langs;
try {
langs = accepts(req).languages();
} catch (err) {
langs = 'en';
}
// const langs = accepts(req).languages()
try {
lang = langs[0].split('-')[0].toLowerCase()
} catch (err) {
lang = 'en';
}
*/
lang = 'en';
}
Просто к вашему сведению, другая функция, упомянутая в моем коде.
//utils.js - the catchAsyncErrors definition
exports.catchAsyncErrors = function (fn) {
return (req, res, next) => {
const routePromise = fn(req, res, next)
if (routePromise.catch) {
routePromise.catch(err => next(err))
}
}
}
Что я должен сделать, чтобы сервер работал нормально, пока он может и то и другое:
- Проверьте
Accept-Language
заголовок. - Не терпит неудачи, когда
Accept-Language
заголовок не представлен.
Комментарии:
1. В чем заключается
accepts
функция?2. @Фил npmjs.com/package/accepts/v/1.3.4
3. В чем заключается ошибка, которую вы получаете
4. @Ошибка Внутреннего Сервера Sagar 500
5. 500 внутренний сервер будет исходить от какого-то промежуточного программного обеспечения или какого-то фрагмента. Попробуйте зарегистрировать ошибку.