Express Регистрация пользователя с ошибкой автоматизации MailChimp - PullRequest
0 голосов
/ 02 марта 2020

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

userRouter. js

//signup
userRouter.post('/signup', async (req, res, next) => {
  const { username, password, email } = req.body;
  const pwDigest = await bcrypt.hash(password, SALT);
  const newUser = await User.create({
    username: username,
    password_digest: pwDigest,
    email,
  });
  const tokenData = {
    username: newUser.username,
    email: newUser.email,
    id: newUser.id,
  };
  const token = genToken(tokenData);
  let userData = newUser.toJSON();
  let { password_digest, ...user } = userData;
  res.json({
    token,
    user,
  });
  request
        .post('https://' + mailchimpInstance + '.api.mailchimp.com/3.0/lists/' + listUniqueId + '/members/')
        .set('Content-Type', 'application/json;charset=utf-8')
        .set('Authorization', 'Basic ' + new Buffer('any:' + mailchimpApiKey ).toString('base64'))
        .send({
          'email_address': req.body.email,
          'status': 'subscribed'
        })
        .end(function(err, response) {
          if (response.status < 300 || (response.status === 400 && response.body.title === "Member Exists")) {
            res.send('Signed Up!');
          } else {
            res.send('Sign Up Failed :(');
          }
      });
});

Регистрация работает нормально, и пользователь получает письмо через MailChimp после регистрации. Однако сервер Express также аварийно завершает работу после регистрации:

_http_outgoing.js:535
    throw new ERR_HTTP_HEADERS_SENT('set');
    ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:535:11)
    at ServerResponse.header (/Users/Documents/myProjects/pages/node_modules/express/lib/response.js:771:10)
    at ServerResponse.send (/Users/Documents/myProjects/pages/node_modules/express/lib/response.js:170:12)
    at /Users/Documents/myProjects/pages/routes/userRouter.js:48:17
    at Request.callback (/Users/Documents/myProjects/pages/node_modules/superagent/lib/node/index.js:879:3)
    at /Users/Documents/myProjects/pages/node_modules/superagent/lib/node/index.js:1100:20
    at IncomingMessage.<anonymous> (/Users/Documents/myProjects/pages/node_modules/superagent/lib/node/parsers/json.js:22:7)
    at Stream.emit (events.js:321:20)
    at Unzip.<anonymous> (/Users/Documents/myProjects/pages/node_modules/superagent/lib/node/unzip.js:53:12)

Ошибка возникает на сервере JS at /Users/Documents/myProjects/pages/routes/userRouter.js:48:17, где MailChimp отправляет запрос на публикацию.

Если я удаляю код для MailChimp, ошибка не возникает. Будем благодарны за любые идеи, как это исправить.

1 Ответ

0 голосов
/ 02 марта 2020

Эта строка res.json({token, user,}); непосредственно перед запросом отправляет ответ пользователю, а затем после получения ответа от mailchimp вы пытаетесь отправить ответ еще раз. Вот что вызывает проблему.

...