Javascript 使用正确的回退路由结构从NodeJ中的异步调用传递数据的最佳实践

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

我有一个请求函数,它调用端点并从中获取数据。然后我将此数据传递给hbs模板进行渲染,但由于异步性,传递给模板的数组为空。正确的方法是什么。请帮忙。下面是代码片段

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