重定向原因:发送后无法设置标题

时间:2019-08-24 16:48:52

标签: javascript node.js http redirect nuxt.js

NuxtJS版本2.8.1

我在许多其他页面上都使用了重定向功能,该页面是一个帮助页面,用于重定向到用户的上一个工作页面。除了该错误之外,我没有得到任何其他记录的信息,尽管它确实可以正常工作-我只是不希望将来发生任何警告,因为这仅在我们的生产服务器上发生。

在浏览器中,当转到该页面将我重定向到上一个工作页面时,我在此页面上看到一个302,该页面通过304将我重定向到我尊敬的页面。

我在github上发现了this issue,尽管它使用了fetch()方法。一位贡献者说,像我这样使用asyncData,并且该问题已在2017年的最新版本Nuxtjs中得到修复,但我仍然遇到此错误。

这是我遇到的非致命错误,它仅在生产中出现。

 Error: Can't set headers after they are sent.
     at validateHeader (_http_outgoing.js:491:11)
     at ServerResponse.setHeader (_http_outgoing.js:498:3)
     at setHeadersFromObject (/var/www/production/node_modules/on-headers/index.js:94:16)
     at ServerResponse.setWriteHeadHeaders (/var/www/production/node_modules/on-headers/index.js:122:5)
     at ServerResponse.writeHead (/var/www/production/node_modules/on-headers/index.js:30:36)
     at Object.At.o [as next] (server.js:1:0)
     at t.context.t.context.redirect (server.js:1:0)
     at asyncData (ce3f051d30716eaa1dc4.js:1:0)
     at <anonymous>
     at process._tickDomainCallback (internal/process/next_tick.js:228:7)

我认为是因为NuxtJS不能正确执行301吗?

这是导致此问题的源代码:

async asyncData({ $axios, redirect}) {
    var body = await $axios.$get('/user/session/all');
    if(!body 
    || !body.step
    || body.step == 1){
        redirect('/send/photo');
    }

    const is_auth = await $axios.$get("https://my_api.com/Data/Utility/IsAuthenticated/");
    if(!is_auth.isAuthenticated)
        redirect("/send/account");

    var page = "/send/photo";
    switch(body.step){
        case 2:
            page = "/send/video";
            break;
        case 3:
            page = "/send/message";
            break;
        case 4:
            page = "/send/account";
            break;
        case 5:
            page = "/send/recipient";
            break;
        case 6:
            page = "/send/invoice";
            break;
        case 7:
            page = "/send/invoice";
            break;
        case 8:
            page = "/send/review";
            break;
    }

    redirect(page);
},

那会是什么?

1 个答案:

答案 0 :(得分:1)

在粘贴的重定向代码中,将执行两次。您不会在第一次调用重定向后停止流量。您应该在第一次重定向后添加return

if(!is_auth.isAuthenticated) {
    redirect("/send/account");
    return
}