JS:如何从 return 嵌套函数中保存值

JS: How can i save a value from a return nested function

我使用 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 函数中检查此值。如果客户来自德国,则返回德方,否则返回英文。

我的错误在哪里?我到底需要改变什么? 感谢您的回答

如果没有看到您尝试使用存储在 countrycode 中的值的代码部分,很难确定。

我的猜测是您试图在函数设置值之前读取该值。例如:

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

这里,控制台输出是未定义的,因为 countrycode 直到 POST 完成并且函数设置它的值后才会被设置。要解决此问题,您应该考虑使用只有在设置 countrycode 的值后才会解析的承诺。

server.post()是一个异步函数,它returns立即并且不能给外部同步代码块中的变量赋值。重组代码以处理异步行为:

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))
        }
      })
    })
  })
})

如果您尝试根据用户的语言偏好提供特定版本的应用程序,您可以使用浏览器发送的 Accept-Language header。 header 包含浏览器中配置的用户首选语言。为了方便起见,我建议使用某种 Express middleware like express-request-language.

在你的情况下,这可能看起来像这样:

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)
      }
    })
  })