微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

调用初始 res.render 后将数据发送到 EJS?

如何解决调用初始 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 举报,一经查实,本站将立刻删除。