Несовместимые вызовы mongodb из лазурных функций
Я использую функции Azure, чтобы сделать простой вызов MongoDb (используя Mongoose). Код просто запрашивает базу данных и возвращает файл JSON с общим количеством результатов. Он работает "большую часть времени", но иногда ничего не возвращает (ноль). Я предполагаю, что это как-то связано с моим использованием async / await.
Когда происходит сбой, журнал показывает: [warn] Предупреждение: неожиданный вызов 'log' для объекта контекста после завершения выполнения функции. Пожалуйста, проверьте асинхронные вызовы, которые не ожидаются, или вызовы "done", выполненные до завершения выполнения функции. Имя функции: message-usercount. Код вызова: 0c24b4be-7067-4082-b3b5-f552cdc3963e.
const SubscriberCount = require('./models/subscriber');
const getDb = require('../getDb');
getDb();
module.exports = async function(context, req) {
try {
await SubscriberCount.find({ subscribed: true },
function(err, sub) {
if (err) return respond('Error!');
if (sub) {
context.log('Sub: ' + sub);
const subscriber_general = sub.filter(subgen => subgen.subscribed_general === true);
return respond(`{"subscribed":${sub.length}, "subscribed_general":${subscriber_general.length}}`);
}
});
} catch (error) {
context.log.error('Some error: ' + error);
}
function respond(message) {
context.res = {
status: 200 /* Defaults to 200 */,
headers: {
'Content-Type': 'application/json',
},
body: message,
};
}
};
// getDB.js
const config = require('./config');
const mongoose = require('mongoose');
let dbInstance;
module.exports = async function() {
if (!dbInstance) {
dbInstance = await mongoose.connect(config.mongoUrl);
}
return dbInstance;
};
// config.js
const cfg = {};
cfg.mongoUrl =
'mongodb+srv://util-rw:' + process.env.MONGO_ATLAS_PW_RW + '@mongodb-wels-util-qsgth.gcp.mongodb.net/wels-sms?retryWrites=true';
module.exports = cfg;
Ожидаемый ответ, который я получаю в 75% случаев: {"подписано":1, "подписано":1}
ОБНОВЛЕНИЕ: Было ли немного больше исследований и смешивания асинхронных / ожидающих и обратных вызовов, кажется проблематичным в некоторых сценариях. Так что я немного переработал вещи, и это, кажется, работает. Соответствующий фрагмент ниже:
try {
const subCount = await SubscriberCount.find({ subscribed: true }).exec();
const subscriber_general = subCount.filter(subgen => subgen.subscribed_general === true);
return respond(`{"subscribed":${subCount.length}, "subscribed_general":${subscriber_general.length}}`);
} catch (error) {
context.log.error('Some error: ' + error);
}