我需要一些帮助来了解如何将 mongoose 与 express 一起使用。我发现一个教程帮助我创建了一个 API,该 API 使用 MVC 类型的模式从 MongoDB 返回记录,但不是返回到我的路由器,而是将结果写入响应,因为它是一个 API...
这是高级设置
Form.Model - 包含我的 Form 对象的架构
Form.Controller - 包含从数据库返回记录的代码
Form.Router - 这是我的路由器,它将结果返回到响应对象。
这是我正在努力解决的示例路线,我想将其转换为我想返回结果然后在我的路由器中使用它们的东西,而不是写入资源。
// Retrieve all Forms from the database.
exports.findAll = (req, res) => {
const email = req.query.solcon;
var condition = email ? { email: { $regex: new RegExp(email), $options: "i" } } : {};
Form.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Forms."
});
});
};
来自我的路由器的代码(可能不正确)基本上我想调用表单路由器,返回表单,然后将它们发送到我的索引 ejs 页面。
router.get('/',function(req, res, next) {
let formList =forms.findAll(req.oidc.user.email);
res.render('index', { title: 'Express', user: req.oidc.user.email, forms : formList });
});
我远非专家,甚至不擅长使用 Promise、async wait...因此很难更改此代码以使其正常工作。
有人可以帮我将此查找所有功能转换为我可以在 Form.Router 中使用的功能,以将结果发送到索引页。
您的
findAll
似乎没有做那么多来保证自己的方法,因此一种选择可能是将逻辑移至路由器回调中,如下所示:
router.get('/', async function(req, res, next) { //< Mark callback as async
try{
const email = req.query.solcon;
const condition = email ? { email: { $regex: new RegExp(email), $options: "i" } } : {};
const formList = await Form.find(condition); //< Now you can await the results
res.render('index', {
title: 'Express',
user: req.oidc.user.email,
forms: formList
});
}catch(err){
console.log(err);
res.render('index', {
title: 'Express',
message: 'Error on server'
});
}
});
或者,您可以使用
findAll
作为回调,如下所示:
exports.findAll = async (req, res) => { //< Mark as async
try{
const email = req.query.solcon;
const condition = email ? { email: { $regex: new RegExp(email), $options: "i" } } : {};
const formList = await Form.find(condition); //< Now you can await the results
return res.render('index', {
title: 'Express',
user: req.oidc.user.email,
forms: formList
});
}catch(err){
console.log(err);
return res.render('index', {
title: 'Express',
message: 'Error on server'
});
}
};
然后在你的
router
中使用它,如下所示:
router.get('/', forms.findAll);