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)
}
})
})
我使用 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)
}
})
})