Я работаю над 2-мя подключенными веб-приложениями в NodeJS. Давайте назовем их A и B. Большинство из них работает, но ...
В приложении A есть видеопоток, и пользователь может задать вопрос в форме. Я использую jquery и ajax для отправки формы и отправки почтового запроса, который вставляет вопрос в MongoDB - каждый в виде отдельного документа. Приложение B читает вопросы из коллекции, используя также jquery и ajax. Он делает запрос на получение каждые 5 секунд - я использовал setInterval
. И вот мы здесь.
Когда я запускаю оба приложения, они работают в течение некоторого времени, НО случайное приложение A отправляет запрос на публикацию с вопросом, добавленным ранее. Иногда приложение B стирает все документы из БД и т. Д. Я предполагаю, что за этим стоит логика, но я ее не вижу.
Ниже приведены проблемные фрагменты кода.
Приложение A
API-часть:
index.post('/ask', (req, res) => {
var question = req.body.question;
var person = req.body.person;
mongo.connect(url, {useNewUrlParser:true}, (err, dbo) => {
if(err) return;
else{
var db = dbo.db('question');
db.collection('asked').insertOne({question:question, who:person}, (err) => {
if(err) return;
})
}
})
})
AJAX часть:
$('#ask_question').on('submit', function(event) {
event.preventDefault();
event.stopImmediatePropagation();
var question = $('#inputDefault').val();
var who = $('#exampleSelect1').val();
console.log(question + ' '+ who);
$.ajax({
url: '/ask',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify({
question: question,
person:who
}),
success: function(response) {
console.log(response);
}
});
});
Приложение B
API:
index.get('/asked', (req, res) => {
mongo.connect(url, {useNewUrlParser:true}, (err, dbo) => {
if(err) return;
else{
var db = dbo.db('question');
db.collection('asked').find({}).toArray((err, result) => {
if(err) return;
if(!result) return;
else res.send(result);
})
}
})
})
ajax часть:
setInterval(()=>{
$.ajax({
url: '/asked',
method:'GET',
contentType: 'application/json',
async: false,
success: function(response) {
var form = $('#asked');
$('#asked').empty();
$.each(response, function(i, question) {
form.append('<li>'+question.question+ ' ('+question.who+')</li>');
});
}
});
},5000);
Если вам интересно, почему я использую return
, это потому, что я пытаюсь предотвратить сбой MongoDB. Через некоторое время (около 15 минут или около того) я получаю сообщение об ошибке:
.../node_modules/mongodb/lib/operations/mongo_client_ops.js:474
throw err;
^
Error: write EPIPE
at Object.exports._errnoException (util.js:870:11)
at exports._exceptionWithHostPort (util.js:893:20)
at WriteWrap.afterWrite (net.js:763:14)
Это происходит в обоих приложениях. Я думаю, это простой тупик, но не знаю, как это предотвратить.
Если хотите, я предоставлю большую часть проекта. Я не могу найти решения этих проблем.