AJAX-запрос в случайные моменты и порядок и MongoDB пишут проблему эпипей - PullRequest
0 голосов
/ 15 мая 2019

Я работаю над 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)

Это происходит в обоих приложениях. Я думаю, это простой тупик, но не знаю, как это предотвратить.

Если хотите, я предоставлю большую часть проекта. Я не могу найти решения этих проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...