我正在Express中进行一个具有用户身份验证的项目,并在注册后通过MailChimp向用户发送电子邮件。
//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)
该错误发生在MailChimp正在发送发布请求的服务器JS at /Users/Documents/myProjects/pages/routes/userRouter.js:48:17
中。
如果删除MailChimp的代码,则不会发生此错误。任何有关如何解决此问题的想法将不胜感激。
您正在使用哪个请求库和哪个nodejs版本。但是似乎代码在发送后试图设置标头。您可以尝试用我的代码替换代码吗,如果错误仍然存在,请告诉我。
request.post({
headers: {
'content-type' : 'application/json;charset=utf-8',
'Authorization': `Basic${new Buffer('any:' + mailchimpApiKey ).toString('base64'))}`
},
url:`https://${mailchimpInstance}.api.mailchimp.com/3.0/lists/ ${listUniqueId}/members/`,
body: {
'email_address': req.body.email,
'status': 'subscribed'
}
}, function(error, response){
if (response.status < 300 || (response.status === 400 && response.body.title === "Member Exists")) {
res.send('Signed Up!');
} else {
res.send('Sign Up Failed :(');
}
});