Mongodb expressjs不允许变量保留作用域,即使它们不是本地变量

Mongodb expressjs不允许变量保留作用域,即使它们不是本地变量,mongodb,express,mongoose,Mongodb,Express,Mongoose,我希望保留mongoDB文档中的值,以将它们作为响应返回。代码如下所示: exports.UserDiseaseInfo = (req, res, next) => { let retval = {}; let dId = ""; let subDName = ""; let body = req.body; let UId = (body.UId != undefined) ? body.UId : false; let SubDId =

我希望保留mongoDB文档中的值,以将它们作为响应返回。代码如下所示:

exports.UserDiseaseInfo = (req, res, next) => {
    let retval = {};
    let dId = "";
    let subDName = "";
    let body = req.body;
    let UId = (body.UId != undefined) ? body.UId : false;
    let SubDId = (body.SubDId != undefined) ? body.SubDId : false;
    if (UId == false || SubDId == false) {
        res.status(404).send({
            response: "Fail",
            body: req.body
        });
    }

    subDisease_model.findById(SubDId, function(error, doc) {
        dId = doc['DiseaseID'];
        subDName = doc['SubDisease'];

    });

    let data = {
        response: 'success',
        subDisease: subDName,
        DiseaseId: dId

    }
    res.status(200).send(data);
};

However the output is:
{
  "response": "success",
  "subDisease": "",
  "DiseaseId": ""
}
然而它应该是

{
  "response": "success",
  "subDisease": "Migraine",
  "DiseaseId": "5ad0850efdcab0ab875c48a4"
}

有什么建议我遗漏了什么吗?

因为查询需要一些时间才能返回数据,这就是为什么您需要将
数据
res.send
放在查询回调中的原因。。。这是唯一一个真正有数据的地方

exports.UserDiseaseInfo = (req, res, next) => {
  let retval = {};
  let dId = "";
  let subDName = "";
  let body = req.body;
  let UId = (body.UId != undefined) ? body.UId : false;
  let SubDId = (body.SubDId != undefined) ? body.SubDId : false;
  if (UId == false || SubDId == false) {
    res.status(404).send({
      response: "Fail",
      body: req.body
    })
  }
  subDisease_model.findById(SubDId, function(error, doc) {
    if (error) {
      let data = {
        response: 'false',
        subDisease: "",
        DiseaseId: ""
      }
      return res.status(404).send(data);
    } else {
      dId = doc['DiseaseID'];
      subDName = doc['SubDisease'];
      let data = {
        response: 'success',
        subDisease: subDName,
        DiseaseId: dId
      }
      return res.status(200).send(data);
    }
  })
}

@Ashish请详细说明请修复代码中的缩进,因为它不是真正可读的。请将
数据的定义和
res.send()
放在回调中。这是数据库结果唯一可用的地方。在执行
res.send()
之后很长一段时间,就会调用回调函数,因此变量还没有值。数据库调用是非阻塞的。这意味着代码将在继续运行并在稍后调用回调后继续运行。如果您的代码格式正确,这一点会更加明显。@jfriend00您介意帮我写一点代码吗?我不知道那个注释是什么意思?你在这里提问,我们会尽力帮助你。这就是我对上一条评论所做的。如果出现错误
if(error){…}
,也需要进行错误处理。还需要在前面的
res.status(404.send()
@Ashish之后返回
,谢谢您的帮助。但是,如果我想使用回调之外的任何数据值,该怎么办?非常感谢您的时间和帮助。@Satya-您不能在回调之外使用它们,除非您将它们传递给从回调中调用的函数。这就是node.js中异步编程的工作原理。@jfriend00,我欠你一个熊人。无论何时!!:)非常感谢。