错误:在发送快递后无法设置标头

时间:2017-01-18 20:49:30

标签: node.js reactjs express redux

我正在探索节点并使用redux表达,我想在页面呈现后设置一个cookie,并希望使用更新的状态来设置一个cookie,我收到了这个错误。

请帮助我获得以下答案? 1)让我知道我写的语法是否正确,如果没有,那么应该怎么做? 2)如何在成功呈现ejs文件后设置cookie以响应?

router.get('/dashboard',isLoggedIn,(req, res) => {


    store.dispatch(initialize(reduxOauthConfig))
        .then(() => match({ routes: dashroutes, location: req.url }, (error, redirectLocation, renderProps) => {
          if (redirectLocation) {
            res.redirect(301, redirectLocation.pathname + redirectLocation.search);
          } else if (error) {
            res.status(500).send(error.message);
          } else if (!renderProps) {
            res.status(404).send('Not found');
          } else {
            loadOnServer({ ...renderProps, store })
              .then(() => {
                const componentHTML = ReactDOMServer.renderToString(
                  <Provider store={store}>
                    <ReduxAsyncConnect {...renderProps}/>
                  </Provider>
                );

       const initialState = store.getState();


          res.render('dashboard.ejs', {
                    markup: componentHTML,
        intialState:initialState
                 });
             })
         .then(html => {
           // !!! IMPORTANT TO PERSIST SESSION IF JavaScript failed to load / initialize
           res.cookie('authHeaders', JSON.stringify(getHeaders(store.getState())), { maxAge: now() * 0.001 + 14 * 24 * 3600 });

           res.end(html);
       })
         .catch(err => {
           console.log(err.stack);
           res.end(err.message);
         });
   }
 }));
});

1 个答案:

答案 0 :(得分:0)

此错误是由于在响应已发送并完成后尝试发送更多响应而导致的。这个问题通常是在人们的代码中通过请求处理程序中的错误异步处理触发的。

在您的保证链中,您正在res.render(),然后是res.cookie(),然后是res.end(html)

res.render()本身发送响应。然后,以下两个命令在响应已发送时尝试发送响应,从而得到您看到的错误。

此外,.then()之后的第二个loadOnServer()处理程序似乎期待您命名为html的参数,但前一个.then()处理程序不会返回任何内容,因此html 1}}参数将是未定义的。

我不清楚你打算在这里使用什么逻辑,因为你似乎试图在同一个承诺链中两次发送渲染的HTML。