Как избежать ошибки 500 для express, когда в запросе нет заголовка на языке принятия, в то время как у меня есть логика, основанная на этом заголовке?

#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 внутренний сервер будет исходить от какого-то промежуточного программного обеспечения или какого-то фрагмента. Попробуйте зарегистрировать ошибку.