Mongoose - .find方法中的函数不传递结果

时间:2017-03-02 12:44:55

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

如何将函数的结果成功传递给.find方法?如果用户提交了非空字符串,我希望通过body-parser传递的参数用作键'name'的值。如果用户提交了一个空字符串,那么应该将空对象传递给.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')
    }

非常感谢!

3 个答案:

答案 0 :(得分:1)

在猫鼬中,你有两种可能来发现查找请求

  • 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 pure find()功能类似,对我而言,它是发出请求的最佳方式。

编辑:

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

例如,您可以这样做:

let findQuery = {};

if (req.body.querydb) {
    findQuery.name = req.body.querydb
}

someModel.find(findQuery, function (err, users) {
    // ...
});

答案 1 :(得分:0)

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

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')
}

答案 2 :(得分:0)

据我所知,您希望将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);
        }
    })
});

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