JavaScript-функция Azure, прочитанная из CosmosDb, подключается, но время ожидания запроса не выдается - PullRequest
0 голосов
/ 25 апреля 2019

Я изучаю функции Azure и CosmosDb для рабочего проекта.Я считаю, что я выполнил большую часть того, что мне нужно, но мой запрос функции Azure JS выполняется, но время ожидания и ничего не возвращается.Ниже приведен мой полный функциональный код, мой выход из системы и клип из CosmosDb Data Explorer с данными.По выходным данным журнала видно, что запрос выполняется, но он всегда истекает.

Я передаю: monsterId = 5cc1b65f7dfa950cd42a5b8e в строке запроса.

let mongoClient = null;

module.exports = (context, req) => {
	const monsterId = req.query.monsterId;
	if (!monsterId) {
		context.res = {
			status: 400,
			body: "Please pass a 'monsterId' in the query string"
		};
		context.done();
	} else {
		function runQuery() {
			// Run the getMonster query
			const query = {
				"id": monsterId,
				"del": false
			};
            context.log('Running query now...');
			mongoClient.db('mfw-dev').collection('monsters')
				.findOne(query)
				.then(doc => {
					context.res = {
						body: { "monster": doc },
					};
					context.done();
				}, error => {
					context.err('Monster find error: ', error);
					context.res = {
						status: 400,
						body: { "error": "Monster find error: " + error },
					};
					context.done();
				});
		};

		if (mongoClient != null) {
		    runQuery();
        } else {
			mongoClient = require("mongodb").MongoClient;
			const uri = process.env.COSMOS_CONN;
			mongoClient.connect(uri, { useNewUrlParser: true })
				.then(client => {
					context.log('MongoClient connected!!!...');
					//mongoClient = client;
					runQuery();
				}, error => {
					context.err('MongoClient connect error: ', error);
					context.res = {
						status: 400, /* Defaults to 200 */
						body: { "message": "MongoClient connect error: " + error },
					};
					context.done();
				});
		}
	}

};

Azure function log output

enter image description here

1 Ответ

1 голос
/ 25 апреля 2019

Основная проблема заключается в том, что вы запрашиваете с помощью статического клиента Mongo, а не возвращенного подключенного экземпляра.В общем, все это выглядит гораздо более запутанным, чем должно быть.

const MongoClient = require('mongodb').MongoClient;
const { COSMOS_CONN } = process.env;
let client = null;

module.exports = async (context, req) => {
  const monsterId = req.query.monsterId;
  if (monsterId) {
    client = client || await MongoClient.connect(COSMOS_CONN, { useNewUrlParser: true });
    context.log('Running query now...');
    const monster = await client
      .db('mfw-dev')
      .collection('monsters')
      .findOne({
        id: monsterId,
        del: false
      });
    context.res = {
      body: { monster },
    };
  } else {
    context.res = {
        status: 400,
        body: "Please pass a 'monsterId' in the query string"
    };
  }
};

Вы заметите основные различия здесь:

  • Я не звоню context.done в любом месте
  • Я не обрабатываю никаких ошибок

Это потому, что context.done автоматически вызывается, когда функция async завершена, и если в любой момент любой изasync вызывает throw, ошибка перехватывается и регистрируется автоматически.

Следует отметить, что вы, возможно, захотите что-то более надежное в настройке MongoClient, то есть, вероятно, лучше проверить, существует ли клиент и подключены, но я оставлю вас делать мелкие мелочи :) 1022 *

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