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