我希望在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是未定义的错误,我不知道如何以任何方式完成它。我想在导航栏中显示活动播放器和服务器状态。实现这一目标的常见做法是什么?
提前致谢!
答案 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
你运行请求。
希望这有帮助!