从CosmosDb读取的Azure JavaScript函数连接但查询超时而没有输出

问题描述 投票:0回答:1

我正在为一个工作项目学习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

javascript function azure azure-cosmosdb
1个回答
1
投票

这里的主要问题是您使用静态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设置周围有一些更强大的东西,即最好检查一下客户端是否存在并连接,但我会留下你做的细节:)

© www.soinside.com 2019 - 2024. All rights reserved.