2017-01-18 8 views
0

Я изучаю узел и выражаю с помощью сокращения, где я хочу установить cookie после отображения страницы и хочу использовать обновленное состояние для настройки файла cookie, где я получив эту ошибку.Ошибка: не удается установить заголовки после их отправки в экспресс

Пожалуйста, помогите мне в получении ответов на следующие вопросы? 1) Сообщите мне, какой синтаксис я написал правильно или нет, а если нет, то что делать? 2) Как я могу настроить cookie на ответ после успешного рендеринга файла ejs?

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); 
     }); 
    } 
})); 
}); 
+0

Возможный дубликат [Ошибка: невозможно установить заголовки после их отправки клиенту] (http://stackoverflow.com/questions/7042340/error-cant-set-headers-after-they-are-sent -to-the-client) –

+0

@JohnWeisz - Я бы не назвал это дураком этого. Здесь возникает вопрос: ПОЧЕМУ этот специальный код генерирует это сообщение об ошибке и что является нарушающим компонентом этого кода. В этом другом ответе ничего не говорится о том, что не так с этим конкретным кодом. – jfriend00

+0

@ jfriend00 - Хотя я и согласен с вами, я также считаю, что в этом случае это сводится к вопросу вкуса и личных предпочтений, учитывая, что это классическая проблема программирования на стороне сервера, где понимание общего принципа за вопросом сам по себе является ответом: _no конструирование контента перед заголовками или использование выходной буферизации_. –

ответ

0

Эта ошибка вызвана попыткой отправить больше ответа после того, как ответ уже отправлен и завершен. Эта проблема часто запускается в коде пользователя с помощью неправильной обработки асинхронных запросов в обработчиках запросов.

В вашей цепочке обещаний вы делаете res.render(), затем res.cookie(), затем res.end(html).

res.render() все само собой отправляет ответ. Следующие две команды затем пытаются отправить ответ, когда ответ уже отправлен, и вы получите сообщение об ошибке, которое вы видите.

Кроме того, ваш второй .then() обработчик после loadOnServer(), кажется, ожидает аргумент вы назвали html, но предыдущий .then() обработчик не возвращает ничего, так что html аргумент будет не определен.

Непонятно, что вы намерены использовать здесь логику, поскольку вы пытаетесь отправить отображаемый HTML дважды в одну и ту же цепочку обещаний.

+0

После рендеринга панели инструментов, redux обновил мое состояние заголовков, вызвав действие UPDATE_HEADER, и я хочу установить эти обновленные заголовки в состояние как cookie. Также элемент html - это ничего, кроме componentHTML. – codefriend

+0

Просто дайте мне знать, как установить cookie после res.render или для более глубокой информации о проблеме, проверьте [link] (https://redux-oauth-demo.herokuapp.com) и проверьте состояние и часть состояния сервера в виджет, показанный там в разделе auth – codefriend

+0

@Coder. Вы не можете установить cookie ПОСЛЕ отправки ответа. Вам нужно установить его раньше. Файл cookie является частью ответа. Вы можете переместить 'res.cookie()' перед тем, как сделать 'res.render()' и удалить 'res.end (html)'. Если вы полагаетесь на некоторый побочный эффект 'res.render()', и поэтому вы хотите установить cookie после отправки визуализированного HTML, тогда вам нужно исправить дизайн. Вы просто не можете этого сделать. Вы можете вручную отобразить переменную (которая не будет отправлять результат), а затем установить cookie, а затем отправить html. Но на самом деле вы должны удалить дизайн побочных эффектов. – jfriend00