Причина
Это потому, что оператор return
в вашем обещании не заканчивает вашу очередь then
. Вы отвечаете 401
, если вы не нашли User
, а на втором then
вы отвечаете 401 снова, если нет результата.
Express говорит вам, что вы можете отправлять заголовки дважды, что правда. Я думаю, что в вашем коде нет ничего, связанного с MongoDB.
Совет: попробуйте преобразовать ваш маршрут в try/catch/await
код, чтобы лучше понять происходящее
Возможное решение
Изменить: это должно работать
// You don't need next as you're ending the request here and not calling it anyway
router.post("/login", async (req, res) => {
const user = await User.findOne({ email: req.body.email });
if (!user) {
return res.status(401).json({
message: "Auth failed"
});
}
const { username } = user;
const goodPassword = bcrypt.compareSync(req.body.password, user.password);
if (!goodPassword) {
return res.status(401).json({
message: "Auth failed"
});
}
const token = jwt.sign( // Double check if this call is synchronous or not (needs await or not)
{
email: user.email,
userId: user._id,
username: username
},
"secret_this_should_be_longer",
{ expiresIn: "1h" }
);
// Maybe store the token in the cookies instead of sending back, as you wish !
res.status(200).json({
token: token,
expiresIn: 3600,
userId: user._id,
username: username
});
});
Обратите внимание, что использование await
помогает вам понять ваш код!
Аутентификация MongoDB
Относительно ваша аутентификация MongoDB, вам нужно использовать те же учетные данные, что и в первом методе
const { COSMOSDB_HOST, COSMOSDB_PORT, COSMOSDB_DBNAME, COSMOSDB_USER, COSMOSDB_PASSWORD } = process.env;
mongoose.connect(`mongodb://${COSMOSDB_HOST}:${COSMOSDB_PORT}/${COSMOSDB_DBNAME}?ssl=true&replicaSet=globaldb`,
{
auth: {
user: COSMOSDB_USER,
password: COSMOSDB_PASSWORD,
},
},
);
const db = mongoose.connection;
db.on('error', console.error.bind(console, 'MongoDB connection error:'));
db.once('open', (callback) => {
console.log('MongoDB connected!!');
});