如何解决调用初始 res.render 后将数据发送到 EJS?
我试图在我的代码中第二次将一个变量传递给 EJS,但遇到了麻烦。这是我的代码:
axios.get(yearURL)
.then(function (res) {
let data = res.data.MRData.SeasonTable.Seasons;
years = data.map(d => d.season);
app.get('/',function (req,res) {
res.render('index.ejs',{
years: years
});
app.post('/down',function(req,res) {
let year = req.body;
res.redirect('/');
axios.get(`http://ergast.com/api/f1/${year.year}/drivers.json`)
.then(function (res) {
let data = res.data.MRData.DriverTable.Drivers;
drivers = data.map(d => `${d.givenname} ${d.familyName}`);
})
.catch(function (err) {
console.log(err);
})
res.render('index.ejs',{
drivers: drivers,years: years
});
然而,每当我运行它时,我都会收到一个错误,即在将标头发送到客户端后我无法设置标头。我也在其他地方读到过,显然你不能两次调用 res.render 。所以我的问题是,在我之前已经调用过 res.render 一次之后,如何将另一组数据传递给 EJS?
解决方法
这里是伪代码。用这种逻辑结构开始你的程序,然后实现它是很好的:
-
定义就绪=假,错误=假,数据=未定义 变量。
-
从远程API获取数据,在then分支中,设置 ready = true,将结果分配给数据。在错误分支中,设置错误 = 真的。我们应该重试错误吗?
-
定义 / GET 路由。
- 如果没有准备好,检查错误。如果没有出错,我们还在等待数据。在这种情况下,我们是等待调用解决,还是返回一些信息给客户端让他们知道?
- 如果没有准备好并出错,请告诉客户端发生了错误。
- 如果 ready == true,那么我们就有数据来向客户端呈现响应。
-
定义 /down 路由。它需要带一个 year 参数,我们需要在路由处理程序中进行异步调用以获取数据。
- 我们能否缓存数据,以便对同一年的后续调用返回我们之前获取的数据?如果可以,将对象用作查找字典。如果该对象具有该年份的键,则使用缓存的数据来呈现响应。如果没有,则进行调用,然后在 then 分支中将响应添加到缓存对象中,并使用数据呈现响应。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。