Я расширил проект приложения чата с курса для узлов, который использует express и socket.io.Я включил больше маршрутов, которые облегчают / регистрация / вход / выход из системы.Все отлично работает в местной среде.Если я просто изменю свой URI mongodb на свою ссылку в изолированной среде mLab, маршрут входа в приложение будет прерван.Я искал бесчисленные темы для решения, но ни одно из предложений не сработало.Я довольно новичок в ноде, поэтому я могу просто упустить что-то, что было бы очевидно опытным разработчикам.
Вот ошибка, которая выдается:
events.js:167
throw er; // Unhandled 'error' event
^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:470:11)
at ServerResponse.header (/Users/B/Desktop/shadow-gab/node_modules/express/lib/response.js:767:10)
at ServerResponse.send (/Users/B/Desktop/shadow-gab/node_modules/express/lib/response.js:170:12)
at User.findOne (/Users/B/Desktop/shadow-gab/server.js:128:27)
at /Users/B/Desktop/shadow-gab/node_modules/mongoose/lib/model.js:4533:16
at process.nextTick (/Users/B/Desktop/shadow-gab/node_modules/mongoose/lib/query.js:2584:28)
at process._tickCallback (internal/process/next_tick.js:61:11)
Emitted 'error' event at:
at /Users/B/Desktop/shadow-gab/node_modules/mongoose/lib/model.js:4535:13
at process.nextTick (/Users/B/Desktop/shadow-gab/node_modules/mongoose/lib/query.js:2584:28)
at process._tickCallback (internal/process/next_tick.js:61:11)
[nodemon] app crashed - waiting for file changes before starting...
Вот POST-маршрут, который приводит к сбою приложения:
app.post('/chat', (req, res) => {
if (!req.session.screenname) {
console.log(req.body);
User.findOne({ screenname: req.body.screenname }, (err,doc) => {
if (err) {
console.log(err);
res.status(500).send('error occured');
} else if (!doc) {
res.status(500).send('Account doesn\'t exist. Please sign up.');
} else if (doc) {
let valid = bcrypt.compareSync(req.body.password, doc.password);
if (!valid) {
res.status(500).send('Incorrect Password');
} else if (valid) {
req.session.screenname = req.body.screenname;
console.log(req.session);
io.on('connection', (socket) => {
console.log('New user connected');
socket.on('join', (params, callback) => {
if (!isRealString(req.body.screenname) || !isRealString(req.body.room)) {
return callback('Name and room name are required');
}
socket.join(req.body.room);
users.removeUser(socket.id);
users.addUser(socket.id, req.body.screenname, req.body.room);
io.to(req.body.room).emit('updateUserList', users.fetchUserList(req.body.room));
socket.emit('newMessage', generateMessage('Admin', `Welcome to ${req.body.room} room`));
socket.broadcast.to(req.body.room).emit('newMessage', generateMessage('Admin', `${req.body.screenname} has joined`));
callback();
});
});
}
}
});
}
res.sendFile(path.join(__dirname + '/public/chat.html'));
});
Казалось бы, наиболее распространенным ответом на подобные вопросы был поиск мест, где вы пытаетесь сделать более одногоответ на запрос, но я нигде не вижу, где я это делаю.
Опять же, я могу просто переключить URL-адрес БД на мою локальную машину, и все работает отлично.Любое направление будет приветствоваться
РЕДАКТИРОВАТЬ : приложение не работает с первой попытки входа в систему, но если я использую маршрут выхода из системы, а затем войдите назад в,приложение работает.Все еще не уверен, что вызывает это