Как исправить: «Не удается установить заголовки после их отправки» в nodejs в cronjob - PullRequest
0 голосов
/ 02 июля 2019

Я создаю серверное приложение, которое проверяет почтовый ящик office365 и в соответствии с полученными на него электронными письмами предпринимает определенные действия. Потому что office365 требует, чтобы я подключился через веб-интерфейс для получения токена. Таким образом, я генерирую взаимодействие через Интернет, а затем беру токен и использую его в cronjob, чтобы продолжить просматривать его каждый раз. Примерно через 50 минут программа выдаст следующую ошибку.

(node:1270) UnhandledPromiseRejectionWarning: 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 ServerResponse.res.set.res.header (/mnt/c/Users/gcontreras/Desktop/proyectos/testing-outlook/node_modules/express/lib/response.js:524:10)
    at ServerResponse.res.cookie (/mnt/c/Users/gcontreras/Desktop/proyectos/testing-outlook/node_modules/express/lib/response.js:608:8)
    at saveValuesToCookie (/mnt/c/Users/gcontreras/Desktop/proyectos/testing-outlook/helpers/auth.js:52:7)
    at Object.getAccessToken (/mnt/c/Users/gcontreras/Desktop/proyectos/testing-outlook/helpers/auth.js:101:5)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
(node:1270) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 40)

Ошибка в этой части кода:

Centos 7, работает nodejs 8.10 с экспресс-версией 4.0

if (refresh_token) {
    const newToken = await oauth2.accessToken.create({refresh_token: refresh_token}).refresh();
    saveValuesToCookie(newToken, res);
    return newToken.token.access_token;
  }

, которая относится к этой функции:

function saveValuesToCookie(token, res) {
  // Parse the identity token
  const user = jwt.decode(token.token.id_token);

  // Save the access token in a cookie
  res.cookie('graph_access_token', token.token.access_token, {maxAge: (365 * 24 * 60 * 60 * 1000), httpOnly: true});
  // Save the user's name in a cookie
  res.cookie('graph_user_name', user.name, {maxAge: (365 * 24 * 60 * 60 * 1000), httpOnly: true});
  // Save the refresh token in a cookie
  res.cookie('graph_refresh_token', token.token.refresh_token, {maxAge: (365 * 24 * 60 * 60 * 1000), httpOnly: true});
  // Save the token expiration time in a cookie
  res.cookie('graph_token_expires', token.token.expires_at.getTime(), {maxAge: (365 * 24 * 60 * 60 * 1000), httpOnly: true});
}

Вначале я думал, что если я изменю максимальное время до истечения срока действия значений в файле cookie, он будет работать, чтобы не потерять токен обновления, но не результаты.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...