MongoDB - 如何通过find()传递数据.count()?

时间:2018-01-27 07:49:43

标签: node.js mongodb express mongoose

我正在练习使用MongoDB构建一个简单的Express应用程序。我创建了一个端点,它将按名称搜索用户,然后使用来自数据库的存储数据呈现页面。我试图集成一些代码来处理找不到配置文件的时间,但它打破了应用程序。

此代码有效 - 配置文件页面按预期呈现:

app.get('/profiles/:name', (req, res) => {
    // calling the model
    Profile
        .find({ "name.first": req.params.name })
        .then(profileArray => {
            let profile = profileArray[0];
            let img =
                `<img class="ui rounded image" src="http://api.adorable.io/avatar/250/${profile.name.first}${profile.age}" />`
            res.render('profile', { profile, img });
        })
        .catch(error => {

            if (error.reason === "ValidationError") {
                console.log(error);
                let response404 = error;
                res.render('add', { response404 });
            }
            else {
                console.log(error);
                res.render('add');
            }

        });
});

但是当我在find()then()之间整合以下代码时,会破坏应用:

    .count()
    .then(count => {
        if (count < 1) {
            return Promise.reject({
                code: 404,
                reason: "ValidationError",
                message: "Profile not found. Please create a profile."
            })
        };
    })

以下是包含导致崩溃的代码段的完整端点代码:

app.get('/profiles/:name', (req, res) => {
    // calling the model
    Profile
        .find({ "name.first": req.params.name })
        .count()
        .then(count => {
            if (count < 1) {
                return Promise.reject({
                    code: 404,
                    reason: "ValidationError",
                    message: "Profile not found. Please create a profile."
                })
            };
        })
        .then(profileArray => {
            let profile = profileArray[0];
            let img =
                `<img class="ui rounded image" src="http://api.adorable.io/avatar/250/${profile.name.first}${profile.age}" />`
            res.render('profile', { profile, img });
        })
        .catch(error => {

            if (error.reason === "ValidationError") {
                console.log(error);
                let response404 = error;
                res.render('add', { response404 });
            }
            else {
                console.log(error);
                res.render('add');
            }

        });
});

它抛出此错误:“TypeError:无法读取未定义的属性'0'”。 它指的是我尝试访问从then()返回的数组的第二个find()

似乎来自find()的数据正在丢失。如何通过count()和第一个then()传递找到的文档?

有一点需要注意。当我集成错误处理代码时,我拒绝承诺并使用表单呈现新页面。该部分有效,但在尝试使用DB中确实存在的名称呈现页面时,它会中断。我在链条的某个地方丢失了数据。如果您需要澄清任何内容,请告诉我。感谢。

1 个答案:

答案 0 :(得分:3)

还有另一种方法可以做到这一点。

Profile.find({ "name.first": req.params.name })
.then((docs) => {
  if(docs.length < 1) {
    return Promise.reject({
         code: 404,
         reason: "ValidationError",
         message: "Profile not found. Please create a profile."
   })
   let profile = docs[0];
   let img =`<img class="ui rounded image" src="http://api.adorable.io/avatar/250/${profile.name.first}${profile.age}" />`
        res.render('profile', { profile, img });
  })
   .catch(error => {
        if (error.reason === "ValidationError") {
            console.log(error);
            let response404 = error;
            res.render('add', { response404 });
        }
        else {
            console.log(error);
            res.render('add');
        }
    });
});

您可以使用docs.length获取文档数,docs包含mongoDB返回的数据。这是另一种方法。