Я пишу 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 ()).Есть ли способ решить такую проблему?