Mongoose иногда пропускает добавление данных в БД при использовании метода Update внутри функции Promise - PullRequest
0 голосов
/ 25 декабря 2018

Я пишу API, используя Node.js Express Framework, который делает запросы к некоторым другим внешним API.Мне нужно иметь журналы каждого запроса в базе данных (я использую MongoDB через mongoose).

Проблема заключается в том, что когда я пытаюсь отправить журнал в массив поддокументов методом mongoose Update, иногда он сохраняется вбазы и иногда нет, в обоих случаях без ошибок.Вот некоторые части выполнения кода:

// модуль externalApiCtrl

const request = require('request');
const mongoose = require('mongoose');
const httpContext = require('express-http-context');
const PolicyLog = mongoose.model('PolicyLog');

const updatePolicyLog = (id, log) => {
  return new Promise((resolve, reject) => {
    PolicyLog.update({ "policyId": mongoose.Types.ObjectId(id) },
      { $push: { logs: log } }
    ).then(() => {
      resolve();
    }).catch(err => {
      reject(err);
    });
  });
};

exports.createPolicy = (policy) => {
  return new Promise((resolve, reject) => {
    // prepare request body and do some other stuff here

    let options = {}; // request options (url, method, headers & body)
    request(options, (error, response, body) => {
      if (error)
        reject(error);

      let policyLocalId = httpContext.get("policyLocalId");
      // here comes the trouble
      updatePolicyLog(policyLocalId, {
        method: "reqName",
        request: "reqBody",
        response: body
      }).then(() => {
        resolve();
      }).catch(err => {
        return reject(err)
      });
    });

  });
};

// Модуль основного контроллера

exports.create = (req, res) => {
  let externalApiCtrl = require('./controllers/external-api.controller.js');
  externalApiCtrl.createPolicy(req.policy)
    .then(result => {
      return res.json(result);
    }).catch(err => {
    return res.status(501).json(err);
  });
};

Поэтому, когда вызывается функция updatePolicyLog, похоже, что иногда она разрешается до того, как будет решен метод обновления mongoose (PolicyLog.update ()).Есть ли способ решить такую ​​проблему?

1 Ответ

0 голосов
/ 25 января 2019

Наконец-то я нашел решение.Проблема была не в мангусте, а в модуле express-http-context .Иногда при нескольких параллельных запросах к API контекст терялся, а значение переменной policyLocalId было неопределенным, поэтому mongoose не обновлял журналы.Это произошло на узле borts lts (v.6.16.0), его обновление до carbon lts (v8.15.0) устранило проблему.

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