【问题标题】:JS: How can i save a value from a return nested functionJS:如何从返回嵌套函数中保存值
【发布时间】:2018-10-01 23:46:54
【问题描述】:

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

我的错误在哪里?我究竟需要改变什么? 谢谢你的回答

【问题讨论】:

  • 全局变量的定义应不带var
  • countrycode 不在任何地方使用,只是分配。如果您尝试说明您希望用您的代码完成什么,也许会有所帮助。
  • @JonKoops 感谢您的回答,我更新了我的问题。希望你能更好地理解我...

标签: javascript express next.js


【解决方案1】:

如果您尝试根据用户的语言偏好提供特定版本的应用程序,您可以使用浏览器发送的Accept-Language 标头。此标头包含在浏览器中配置的用户首选语言。为方便起见,我建议使用某种Express middleware,例如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)
      }
    })
  })

【讨论】:

  • 感谢您的回答,这可能是解决方案。你能用我的server. js 文件告诉我吗,我怎样才能准确地检查呢?对此我将不胜感激
  • 是的,我会尽快用一些示例代码更新答案。
  • 非常感谢,您可以使用我的示例代码,以便我可以直接在我的项目中使用您的示例吗?我刚刚开始学习 node JS,这真的很有帮助
  • 添加了一个例子,但是它未经测试。让我知道这是否适合您。
  • 非常感谢您的帮助,现在可以使用了。您知道如何根据语言为 NextJS 设置不同的页面文件夹吗?我知道以某种方式......否则我有问题,必须检查每一页......
【解决方案2】:

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

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

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

这里,控制台输出将是未定义的,因为countrycode 在 POST 完成并且函数设置其值之前不会设置。要解决此问题,您应该考虑使用仅在设置 countrycode 的值后才会解析的 Promise。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 非常感谢您的回答,您的替代方法有效,但 server.getfunction 无效。我总是看到英文页面,而不是德文页面...您对此有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 2020-08-06
    • 2015-08-01
    • 2021-04-15
    • 2019-03-19
    相关资源
    最近更新 更多