JS: Как я могу сохранить значение из возвращаемой вложенной функции - PullRequest
0 голосов
/ 01 октября 2018

Я использую NextJS и React.Мой файл server.js выглядит следующим образом:

const express = require('express')
const next = require('next')
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()

app.prepare()
  .then(() => {
    const server = express()
    var countrycode = ''

    server.post('/', (req, res) => {
        countrycode = req.body.code
     })

     server.get('/', (req, res) => {
        console.log(res)
        if (countrycode == 'DE') {
            return app.render(req, res, '/de', req.query)
        } else {
            return app.render(req, res, '/', req.query)
        }
      })

    })
  })

Я пытаюсь сохранить значение req.body.code во внешней переменной var countrycode, но это не работает.Мне нужно сделать этот шаг, чтобы я мог проверить это значение в функции server.get.Если клиент прибывает из Германии, немецкая сторона должна быть возвращена, в противном случае - английская.

Где моя ошибка?Что именно мне нужно изменить?Спасибо за ваш ответ

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

server.post() - это асинхронная функция, которая немедленно возвращается и не может присваивать значения переменным во внешнем синхронном кодовом блоке.Перестройте ваш код, чтобы справиться с асинхронным поведением:

app.prepare().then(() => {
  const server = express()

  return new Promise((resolve, reject) => {
    server.post('/', (req, res) => {
      resolve(req.body.code);
    })
  });
}).then(countrycode => {
  console.log('server responded with countrycode:', countrycode);
})

Альтернативно:

app.prepare()
.then(() => {
  const server = express()

  return new Promise(resolve => {
    server.post('/', (req, res) => {
      resolve(req.body.code);
    })
  })
  .then(countrycode => {
    return new Promise(resolve => {
      server.get('/', (req, res) => {
        console.log(res)
        if (countrycode == 'DE') {
          resolve(app.render(req, res, '/de', req.query))
        } else {
          resolve(app.render(req, res, '/', req.query))
        }
      })
    })
  })
})
0 голосов
/ 01 октября 2018

Если вы пытаетесь обслуживать определенную версию своего приложения на основе языковых предпочтений пользователя, вы можете использовать заголовок Accept-Language, который отправляется браузером.Этот заголовок содержит предпочтительные языки пользователя, настроенные в браузере.Для удобства я бы порекомендовал использовать какое-то Express промежуточное программное обеспечение вроде язык экспресс-запроса .

В вашем случае это могло бы выглядеть примерно так:

const express = require('express')
const next = require('next')
const requestLanguage = require('express-request-language')
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })

app.prepare()
  .then(() => {
    const server = express()

    server.use(requestLanguage({
      languages: ['en-US', 'de-DE']
    }))

    server.get('/', (req, res) => {
      switch (req.language) {
        case 'de-DE':
          return app.render(req, res, '/de', req.query)
        default:
          return app.render(req, res, '/', req.query)
      }
    })
  })
0 голосов
/ 01 октября 2018

Трудно убедиться, не увидев ту часть кода, где вы пытаетесь использовать значение, хранящееся в countrycode.

Я предполагаю, что вы пытаетесь прочитать значение до того, как оно будет установленофункция.Например:

var countrycode;
server.post('/', (req, res) => {
    countrycode = req.body.code
})
console.log(countrycode);

Здесь вывод консоли будет неопределенным, потому что countrycode не будет установлен, пока не завершится POST, и функция не установит его значение.Чтобы это исправить, вы должны использовать обещание, которое разрешается только после установки значения countrycode.

...