发送请求时出现Express标头错误



一个错误"[ERR_HTTP_HEADERS_SENT]在将报头发送到客户端之后不能设置报头";在请求此方法时发生。我刚认识了express,很有可能成功地做了一些事情。告诉我错误的原因

const generateAccessToken = (id,username) => {
const payload = {
id,
username
}
return jwt.sign(payload, secret, {expiresIn: "24h"});
}

async login(req, res) {
try {
const {username, password} = req.body;
pool.query('SELECT * FROM users', (error, result) => {
if(error) return console.log(error);
result.map(item => {
if (item.username !== username) {
return res.status(400).json({message: 'Error username'});
}
const validPassword = bcrypt.compareSync(password, item.password);
if (!validPassword) {
return res.status(400).json({message: 'Error password'});
}
const token = generateAccessToken(item.id,item.username);
return res.json({token});
});
});
} catch (e) {
console.log(e);
res.status(400).json({message: 'Login error'});
}
}

您正在向.map内部的响应进行写入,因此它会多次写入标头,并且您只能这样做一次。

快速浏览表明您可能想做一些类似的事情:

pool.query('SELECT * FROM users WHERE username=:username', { replacements: { username }})

但我不确定你使用的是什么sql驱动程序,它如何处理绑定参数,或者你的用户名列上是否有唯一的索引,等等。

最新更新