api在带有节点js的header.ejs文件上获取请求

时间:2018-03-14 15:52:24

标签: javascript node.js express header ejs

我希望在header.ejs文件中显示来自端点的数据,该文件将显示在所有路由文件中(例如" /"," / news&#34 ;" /狗")

这是我的app.js代码:

// GET API REQUEST
var url = 'https://url.tld/api/';
request(url, function (error, response, body) {
    if(!error && response.statusCode == 200) {
        var parsedData = JSON.parse(body);
        return parsedData;
    }
});

app.get("/", function(req, res) {
    res.render("index.ejs", {parsedData: parsedData});   
    });

来自header.ejs的代码:

<li>Active players: <span><%= parsedData["players"] %></span></li>

我得到一个parsedData是未定义的错误,我不知道如何以任何方式完成它。我想在导航栏中显示活动播放器和服务器状态。实现这一目标的常见做法是什么?

提前致谢!

1 个答案:

答案 0 :(得分:0)

可能你应该使用中间件来解决这个问题。

来自express docs

  

中间件函数是可以访问请求对象(req),响应对象(res)以及应用程序请求 - 响应周期中的下一个中间件函数的函数。下一个中间件函数通常由名为next的变量表示。

     

中间件功能可以执行以下任务:

     
      
  • 执行任何代码。
  •   
  • 更改请求和响应对象。
  •   
  • 结束请求 - 响应周期。
  •   
  • 调用堆栈中的下一个中间件函数。
  •   

中间件始终将请求,响应和函数next作为参数。你做任何你需要做的事情,然后打电话给next进入列表中的下一个事情。

因此,例如,如果您想编写一个简单的中间件,每次应用程序收到请求时都会记录时间,您可以说:

app.use(function(req, res, next) {
  console.log(Date.now())
  next()
})

所以在你的情况下,也许你会说:

app.use(function(req, res, next) {
  // stuff
  request(url, function(err, response, body) {
    //stuff
    res.locals.parsedData = parsedData
  })
})

然后在res.render中,您要说

res.render('index.ejs', {parsedData: res.locals.parsedData})

再次来自express docs

  

[res.locals is]一个对象,它包含作用于请求的响应局部变量,因此仅对在请求/响应周期(如果有)期间呈现的视图可用。否则,此属性与app.locals相同。

如果您知道自己只需要提出一次此请求,请将解析后的数据附加到app.locals,然后在中间件中添加一项检查,看看之前是否存在app.locals.parsedData你运行请求。

希望这有帮助!