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

从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

我正在为一个工作项目学习Azure函数和CosmosDb。我相信我已经解决了我需要的大部分问题,但是我的Azure JS函数查询正在运行,但是超时了,什么也没有返回。下面是我的完整功能代码、我的注销输出和显示数据的CosmosDb数据浏览器的剪辑。您可以通过日志输出看到查询正在执行,但它总是超时

我在查询字符串上传递:monsterId=5cc1b65f7dfa950cd42a5b8e

让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();
});
}
}

};这里的主要问题是您使用的是静态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
。我认为问题的一部分只是总体布局代码,您应该考虑向更多的<代码>异步/代码> /<代码>等待
布局,这将有助于编写更多同步代码并消除回调地狱。谢谢:问题:上面代码中的var >代码>客户端< /代码>我同意,我更喜欢async/await样式。我来自Firebase云函数,所以我没有。注意:看起来没有上下文。done()行,context.log行从不向日志写入任何内容。@Locohost-hmm这很奇怪-我有多个函数不调用
上下文。完成了
并且日志工作正常,可能是时间问题?