【问题标题】:Mongoose - find() not returning anything when no parameters are passed, but returns data when parameters are passedMongoose - find() 在没有传递参数时不返回任何内容,但在传递参数时返回数据
【发布时间】:2021-10-21 13:33:24
【问题描述】:

我在teamMembers.js中有以下型号:

const { Schema, model } = require('mongoose');

const teamMembersSchema = new Schema({
    uid: String,
    name: String,
    hours: Number
})

const TeamMembers = model('teamMembers', TeamMembersSchema);

module.exports = TeamMembers;

我在teamMemberRoute.js 中创建了以下端点:

const TeamMembers = require('./models/teamMembers');

module.exports = (app) => {

    app.get('/api/pods/teamMembers/:uid', async (req, res) => {
        let teamMember = await TeamMembers.find( {'uid': req.params.uid } );
        return res.status(200).send(teamMember);
    });

    app.get('/api/pods/teamMembers', async (req, res) => {
        let teamMembers = await TeamMembers.find();
        return res.status(200).send(teamMembers);       
    });
}

第一个端点 (/api/pods/teamMembers/:uid) 工作正常 - 当我传递 uid 时,它会返回特定于 TeamMember 集合中 uid 的文档。

第二个端点应该返回 TeamMember 集合中的所有文档,因为没有传递任何参数。但是,执行请求时,只返回[]。我们知道 TeamMember 集合中存在文档这一事实,因为第一个端点根据传递的 uid 参数从该集合返回数据。

我对此感到困惑。有任何想法吗?我认为我的模型没有任何问题,因为我能够毫无问题地执行第一个端点。

【问题讨论】:

  • .find({}) 也不起作用。我知道.find() 有效,因为我已经将它用于另一个返回所有文档的集合。但由于某种原因,它不适用于这个 TeamMember 集合。
  • 是的,我试过了。它不起作用。
  • app 是什么?在正常情况下,Express 不会对路由回调的返回值做任何事情,所以如果你的异步函数的承诺被拒绝,它不会对拒绝做任何事情(尽管 Node.js 通常会显示它)。但是,如果您使用的是 Koa 或其他东西……您确定您没有收到拒绝的承诺吗?
  • app 是 Express 的变量。它在我的server.js 中初始化为const app = express();。我不认为我得到了拒绝的承诺。我没有看到任何被退回的东西。我还尝试在第二个异步函数的第一行添加console.log('test'),但在执行请求时什至没有打印出来。
  • 不管是不是问题,这些处理程序都是不正确的。您需要在处理程序中处理拒绝任何承诺,Express 不会为您做这件事。 (这基本上是将处理程序代码包装在try/catch 中并从catch 块发送错误响应。最好将其包装在实用程序函数中。)

标签: javascript node.js mongodb api mongoose


【解决方案1】:

Express 从上到下执行代码,这就是这个问题的原因。它将匹配您的第一个端点并假设uidnull。只需更改已定义端点的顺序,如下所示:

module.exports = (app) => {

    app.get('/api/pods/teamMembers', async (req, res) => {
        let teamMembers = await TeamMembers.find();
        return res.status(200).send(teamMembers);       
    });

    app.get('/api/pods/teamMembers/:uid', async (req, res) => {
        let teamMember = await TeamMembers.find( {'uid': req.params.uid } );
        return res.status(200).send(teamMember);
    });

}

【讨论】:

  • nullundefined? (实际问题。)
  • 既然你这么说,也许它也将是undefined,但在这两种情况下,它都不等于任何uid,以便Mongoose 匹配它。 @T.J.克劳德
猜你喜欢
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多