gpt4 book ai didi

javascript - 从 CosmosDb 读取的 Azure JavaScript 函数已连接,但查询超时且无输出

转载 作者:行者123 更新时间:2023-12-02 23:46:16 25 4
gpt4 key购买 nike

我正在为一个工作项目学习 Azure 函数和 CosmosDb。我相信我已经解决了大部分需要的问题,但我的 Azure JS 函数查询正在运行,但超时并且没有返回任何内容。以下是我的完整功能代码、我的日志输出以及显示数据的 CosmosDb 数据资源管理器的剪辑。您可以通过日志输出看到查询正在执行,但它总是超时。

我在查询字符串上传递: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

最佳答案

这里的主要问题是您正在使用静态 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.doneasync 函数完成时自动调用,并且如果在任何时候有任何 async 调用抛出错误,错误会被捕获并自动记录。

需要注意的一点是,您可能希望 MongoClient 设置更强大一些,即最好检查客户端是否存在并且已连接,但我会让您做实质内容:)

关于javascript - 从 CosmosDb 读取的 Azure JavaScript 函数已连接,但查询超时且无输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55851123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com