Несовместимые вызовы 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);
  }

0 ответов

Другие вопросы по тегам