【问题标题】:findById returning a list of documents instead of a single resultfindById 返回文档列表而不是单个结果
【发布时间】:2019-12-09 22:52:14
【问题描述】:

我试图通过它的对象 ID 从 mongodb 获取一个项目对象,但是当我尝试在邮递员中调用该路由时,它给了我数据库中每个对象的列表(总共 4 个对象)而不是预期一个对象。

这是我为从数据库中获取一个对象而创建的函数

getEvent : function(id,callback)
{
   EventModel.findById(id,callback);
},

下面是我的路线

router.get('/events/:id',function(req,res)
{
    var id = req.params.id;
    db.getEvent(id,function(err,event)
    {
        if(err)
        {
            console.log("Error processing data");
        }
        else{
            console.log("get one event is called");
            res.send(event)`enter code here`;
        }
    })
});

最后下面是结果

Postman Test Result

【问题讨论】:

    标签: node.js mongodb express mongoose postman


    【解决方案1】:

    代码是正确的,你提出请求的方式是错误的

    你的格式:

    http://localhost:3000/events?id=someid
    

    URL 中的id = someID 表示GET 查询参数。

    如果你在路由中使用了像:id这样的通配符参数,那么请求的URL应该是:

    http://localhost:3000/events/someid
    

    someid 现在将出现在req.params.id

    您获得所有对象是因为变量id 在您的情况下是undefined,默认情况下会省略未定义的参数。所以它与调用相同: EventModel.findById({}, callback)

    谢谢

    【讨论】:

    • @dave.. 这正是问题所在。或者,如果您不想更改路线结构,只需将 var id = req.params.id; 更改为 var id = req.query.id;
    • @Narasimha Prasanna HN 我试过你的答案,它奏效了,谢谢你的帮助:)
    • localhost:3000/events?id=someid 哦,顺便说一下,这个 url 是邮递员在我转到 params 选项卡并在 key 列中输入 id 并在 value 列中输入 itemid 时生成的
    【解决方案2】:

    您可以尝试调用 Model.findOne() 而不是 Model.findById

    EventModel.findOne({id}, callback)
    

    【讨论】:

    • 感谢您的帮助;)您的方法也对我有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    相关资源
    最近更新 更多