Javascript 使用正确的回退路由结构从NodeJ中的异步调用传递数据的最佳实践
我有一个请求函数,它调用端点并从中获取数据。然后我将此数据传递给hbs模板进行渲染,但由于异步性,传递给模板的数组为空。正确的方法是什么。请帮忙。下面是代码片段Javascript 使用正确的回退路由结构从NodeJ中的异步调用传递数据的最佳实践,javascript,node.js,express,Javascript,Node.js,Express,我有一个请求函数,它调用端点并从中获取数据。然后我将此数据传递给hbs模板进行渲染,但由于异步性,传递给模板的数组为空。正确的方法是什么。请帮忙。下面是代码片段 app.get("/verifier", keycloak.protect('verifier'), (req, res) => { cirRes = cirJSON.parse(cirJSON.stringify(res)) //the req object is a circular object so you c
app.get("/verifier", keycloak.protect('verifier'), (req, res) => {
cirRes = cirJSON.parse(cirJSON.stringify(res))
//the req object is a circular object so you cannot convert it to json normaly wihtout data loss.
allUser = []
access_token = cirRes.req.kauth.grant.access_token.token
var options = { method: 'GET',
url: 'http://localhost:8080/auth/admin/realms/create_user_realm/users',
headers:
{
'Content-Type': 'application/x-www-form-urlencoded',
Host: 'localhost:8080',
Accept: '*/*',
Authorization: `Bearer ${ access_token }` } }
request(options, function (error, response, body) {
if (error) throw new Error(error);
data = JSON.parse(body)
for (user in data){
allUser.push(data[user])
}
//console.log(allUser)
})
if (res.statusCode != 200) {
res.redirect('/logout')
}
console.log(allUser)
res.render('verifier', {"users": allUser})
})
在上面的代码中,allUser是一个空数组
编辑>>>
这个问题在给出了这个线索的答案后就结束了。
它涵盖了发出异步请求的不同方式
经过同样的过程,我在代码中做了这样的更改
app.get("/verifier", keycloak.protect('verifier'), (req, res) => {
cirRes = cirJSON.parse(cirJSON.stringify(res))
//the req object is a circular object so you cannot convert it to json normaly wihtout data loss.
//console.log(cirRes.req.kauth.grant.access_token.token)
allUser = []
access_token = cirRes.req.kauth.grant.access_token.token
var options = { method: 'GET',
url: 'http://localhost:8080/auth/admin/realms/create_user_realm/users',
headers:
{
'Content-Type': 'application/x-www-form-urlencoded',
Host: 'localhost:8080',
Accept: '*/*',
Authorization: `Bearer ${ access_token }` } }
request(options, function (error, response, body) {
if (error) { throw new Error(error) }
data = JSON.parse(body)
for (user in data){
allUser.push(data[user])
}
//console.log(allUser)
res.render('verifier', {"users": allUser})
})
if (res.statusCode != 200) {
res.redirect('/logout')
}
})
这很好,但根据nodeJS的最佳实践以及nodeJS的最佳实践,这是正确的,因此即使在调用中发生错误,也会有一些回退机制来呈现。移动
res.render()
和res.redirect()
调用,使它们位于请求()的回调函数中。这就是当您想将express中异步提供的信息发送到用户的浏览器或API客户端时,如何使用它的方法。这是完美的选择。您需要在try-catch块中添加选项变量
try{
var options = { method: 'GET',
url: 'http://localhost:8080/auth/admin/realms/create_user_realm/users',
headers:
{
'Content-Type': 'application/x-www-form-urlencoded',
Host: 'localhost:8080',
Accept: '*/*',
Authorization: `Bearer ${ access_token }` } }
request(options, function (error, response, body) {
if (error) { throw new Error(error) }
data = JSON.parse(body)
for (user in data){
allUser.push(data[user])
}
//console.log(allUser)
res.render('verifier', {"users": allUser})
})
if (res.statusCode != 200) {
res.redirect('/logout')
}
}catch(e){
throw(e);
}