【问题标题】:Mongoose - function inside .find method does not pass resultMongoose - .find 方法中的函数不传递结果
【发布时间】:2017-03-03 16:32:31
【问题描述】:

如何将函数的结果成功传递给 .find 方法?如果用户提交了非空字符串,我希望通过 body-parser 传递的参数用作键“名称”的值。如果用户提交了一个空字符串,那么应该将空对象传递给 .find 方法。

函数 console.log 有效。如果我提交一个空字符串,那么 'empty querydb' 将打印到控制台。同样,如果我提交任何其他字符串,则它会正确打印到控制台。

如何将 req.body.querydb 作为值传递给 'name' 键?

HTML

 <form method="POST" action="form_query">
 <input type="textarea" name="querydb">
 <br><br>
 <button> Query </button>
 </form>

.JS

router.post('/form_query', function(req,res) {
someModel.find(function(err,results){
    if(!req.body.querydb){
        console.log("empty querydb")
        return {}
    } else {
        console.log(req.body.querydb)
        return {name:req.body.querydb}
    }
}).exec(function(err, result) {
    if (err) {
        send(err)
    } else {
        console.log('omg')
    }

非常感谢!

【问题讨论】:

    标签: node.js mongodb express mongoose body-parser


    【解决方案1】:

    在 mongoose 中,您有两种可能发出查找请求

    • find(query, callback) 函数
    • 查询生成器

    我建议您使用find() 函数。在您的情况下,您的代码更像这样:

    router.post('/form_query', function(req,res, next) {
        someModel.find({
            name : req.body.querydb
        }, function (err, users) {
            if (err) {
                // request has an error like connection problem
                res({ error : err });
                return;
            }
    
            // request works correctly, you can send the users array for example
            res(users);
        });
    });
    

    find 函数的工作方式类似于 mongodb 纯 find() 函数,对我来说,这是提出请求的最佳方式。

    编辑:

    建议以最佳方式控制传入变量以执行此查找。

    例如,你可以这样做:

    let findQuery = {};
    
    if (req.body.querydb) {
        findQuery.name = req.body.querydb
    }
    
    someModel.find(findQuery, function (err, users) {
        // ...
    });
    

    【讨论】:

    • 这里的想法是正确的,但我会先检查输入以确保它在查询之前存在以避免错误,并可能验证它以确保它不会返回超过应有的返回值是系统上的任何限制,例如 req.body.querydb = {$exists: true} 将返回所有名称可能在系统中不可接受的数据。
    • 通常名称参数被转义,为此,研究在name : " {$exists: true} "。但在您的情况下,我建议在 find() 之前测试和修改参数
    • 感谢您的回复,很抱歉回来晚了。不确定这是否是我正在寻找的,或者我可能没有很好地制定它。斜体 "如果用户提交了一个空字符串,那么应该将空对象传递给 .find 方法。" 我之所以使用 'if' 语句是因为 .find({name:req.body .name}) 用户提交空表单时返回 0 个结果。相反,我希望 API 返回结果,就好像 .find({}) 已执行并返回 someModel 中定义的整个集合一样。请让我知道是否清楚。不确定我是否编辑了第一篇文章(?)
    【解决方案2】:

    我不太确定您在寻找什么,但试图尽可能多地理解我正在提供一些代码。这样你就可以将 req.body.querydb 作为一个值传递给 'name' 键。

    router.post('/form_query', function(req,res) {
    someModel.find({name:req.body.querydb},function(err,results){
    if(!req.body.querydb){
        console.log("empty querydb")
        return {}
    } else {
        console.log(req.body.querydb)
        return {name:req.body.querydb}
    }
    }).exec(function(err, result) {
    if (err) {
        send(err)
    } else {
        console.log('omg')
    }
    

    【讨论】:

      【解决方案3】:

      据我所知,您希望将 api 中的值传递到 mongo 查询中。

      在实际调用之外定义查询然后根据需要构建它或确保在到达查询之前传递一个值可能是有意义的。

      例如:

      router.post('/form_query', function(req,res) {
          if(!req.body.querydb) {
              return res.status(404).send("empty querydb");
          }
      
          // validate querydb param
      
          someModel.find({ name: req.body.querydb }, function(err,results){
              if(!req.body.querydb){
                  console.log("empty querydb")
                  res.send
              } else {
                  console.log(req.body.querydb)
                  return res.status(200).send(results);
              }
          })
      });
      

      如果您使用的是猫鼬,那么回调将在执行后被调用,并且查询是传递给 .find 函数的第一个参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-05
        • 2017-06-10
        • 2016-11-22
        • 1970-01-01
        • 2019-01-14
        • 1970-01-01
        • 2017-08-21
        相关资源
        最近更新 更多