从CosmosDb读取的Azure JavaScript函数已连接,但查询超时且没有输出
我正在为一个工作项目学习Azure函数和CosmosDb。我相信我已经解决了我需要的大部分问题,但是我的Azure JS函数查询正在运行,但是超时了,什么也没有返回。下面是我的完整功能代码、我的注销输出和显示数据的CosmosDb数据浏览器的剪辑。您可以通过日志输出看到查询正在执行,但它总是超时 我在查询字符串上传递:monsterId=5cc1b65f7dfa950cd42a5b8e从CosmosDb读取的Azure JavaScript函数已连接,但查询超时且没有输出,javascript,function,azure,azure-cosmosdb,Javascript,Function,Azure,Azure Cosmosdb,我正在为一个工作项目学习Azure函数和CosmosDb。我相信我已经解决了我需要的大部分问题,但是我的Azure JS函数查询正在运行,但是超时了,什么也没有返回。下面是我的完整功能代码、我的注销输出和显示数据的CosmosDb数据浏览器的剪辑。您可以通过日志输出看到查询正在执行,但它总是超时 我在查询字符串上传递:monsterId=5cc1b65f7dfa950cd42a5b8e 让mongoClient=null; module.exports=(上下文,请求)=>{ const mo
让mongoClient=null; module.exports=(上下文,请求)=>{ const monsterId=req.query.monsterId; 如果(!monsterId){ context.res={ 现状:400, 正文:“请在查询字符串中传递一个‘monsterId’” }; context.done(); }否则{ 函数runQuery(){ //运行getMonster查询 常量查询={ “id”:怪物id, “del”:假 }; log('Running query now…'); mongoClient.db('mfw-dev')。集合('monsters')) .findOne(查询) 。然后(doc=>{ context.res={ 正文:{“怪物”:doc}, }; context.done(); },错误=>{ err('Monster find error:',error); context.res={ 现状:400, 正文:{“错误”:“怪物查找错误:“+error}”, }; context.done(); }); }; if(mongoClient!=null){ runQuery(); }否则{ mongoClient=require(“mongodb”)。mongoClient; const uri=process.env.COSMOS_CONN; connect(uri,{useNewUrlParser:true}) 。然后(客户端=>{ log('MongoClient connected!!!…'); //mongoClient=客户; runQuery(); },错误=>{ err('MongoClient连接错误:',错误); context.res={ 状态:400,/*默认为200*/ 正文:{“消息”:“MongoClient连接错误:“+error}”, }; context.done(); }); } }
布局,这将有助于编写更多同步代码并消除回调地狱。谢谢:问题:上面代码中的var >代码>客户端< /代码>我同意,我更喜欢async/await样式。我来自Firebase云函数,所以我没有。注意:看起来没有上下文。done()行,context.log行从不向日志写入任何内容。@Locohost-hmm这很奇怪-我有多个函数不调用
};代码>这里的主要问题是您使用的是静态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
- 我没有处理任何错误
函数完成时,会自动调用async
,如果在任何时候抛出任何context.done
调用,则会自动捕获并记录错误async
需要注意的一点是,您可能希望在MongoClient设置方面有更强大的功能,也就是说,最好检查客户端是否存在并已连接,但我会让您做一些实质性的工作:)如果您注销是否有结果?我能看到的唯一异常是,这是一个您没有设置doc
。尽管如此,如果这是导致它挂起的原因,我会感到惊讶。我在查询状态的响应。
),它从未实现。或者是承诺没有按预期工作(因为我编码错误?)或者查询实际上从未返回任何内容。既不是成功也不是错误。只是超时。我认为这里的问题是您没有使用已连接的客户端实例,而是使用静态客户端,以证明理论上您应该恢复行中添加了一个context.log(doc)。然后(doc…
。我认为问题的一部分只是总体布局代码,您应该考虑向更多的<代码>异步/代码> /<代码>等待mongoClient=client
上下文。完成了
并且日志工作正常,可能是时间问题?