我正在练习使用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中确实存在的名称呈现页面时,它会中断。我在链条的某个地方丢失了数据。如果您需要澄清任何内容,请告诉我。感谢。
答案 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返回的数据。这是另一种方法。