无法使用多个使用 mongoose 的 find() 函数传入 res.render
Unable to use several find() functions using mongoose to pass in res.render
我在一个网站上工作,该网站在主页上的不同类别组中显示多部电影,因此我尝试使用多个查找函数 (mongoose) 并将它们传递到渲染中以在视图中一起显示它们。问题是如果我尝试将查找函数中的电影数组存储在变量或 res.locals 中,它只是保持“未定义”状态。我似乎无法弄清楚如何在一个 get 响应中传递其中的几个数组。我是 Node 的新手,非常感谢任何帮助!
app.get("/", (req, res) => {
// array of top-selling movies
Movie.find({
group: "Top-Selling Movies"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
res.locals.topMovies = movies;
}
});
// array of new movies
Movie.find({
group: "New rental movies"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
res.locals.newMovies = movies;
}
});
// array of recommended movies
Movie.find({
group: "Recommended For You"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
res.locals.recMovies = movies;
}
});
// array of action/thrilling movies
Movie.find({
group: "Thrilling movies"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
res.locals.actionMovies = movies;
}
});
res.render("categories");
});
我什至尝试过:
app.get("/", (req, res) => {
var topMovies;
var newMovies;
var recMovies;
var actionMovies;
// array of top-selling movies
Movie.find({
group: "Top-Selling Movies"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
topMovies = movies;
}
});
// array of new movies
Movie.find({
group: "New rental movies"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
newMovies = movies;
}
});
// array of recommended movies
Movie.find({
group: "Recommended For You"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
recMovies = movies;
}
});
// array of action/thrilling movies
Movie.find({
group: "Thrilling movies"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
actionMovies = movies;
}
});
res.render("categories", {
topMovies: topMovies,
newMovies: newMovies,
recMovies: recMovies,
actionMovies: actionMovies
});
你可以使用 async/await
app.get("/", async (req, res) => {
const topMovies = await Movie.find({ group: "Top-Selling Movies" })
const newMovies = await Movie.find({ group: "New rental movies" })
const recMovies = await Movie.find({ group: "Recommended For You" })
const actionMovies = await Movie.find({ group: "Thrilling movies" })
return res.render("categories", {
topMovies: topMovies,
newMovies: newMovies,
recMovies: recMovies,
actionMovies: actionMovies
});
});
或者为了更好看的代码
app.get("/", async (req, res) => {
const [topMovies, newMovies, recMovies, actionMovies] = await Promise.all([
Movie.find({ group: "Top-Selling Movies" }),
Movie.find({ group: "New rental movies" }),
Movie.find({ group: "Recommended For You" }),
Movie.find({ group: "Thrilling movies" })
])
return res.render("categories", {
topMovies,
newMovies,
recMovies,
actionMovies
});
});
编辑:同样在您的示例中,您可以仅使用过滤方法来限制数据库查询
app.get("/", async (req, res) => {
const movies = await Movie.find()
const topMovies = movies.filter(movie => movie.group === 'Top-Selling Movies');
const newMovies = movies.filter(movie => movie.group === 'New rental movies');
const recMovies = movies.filter(movie => movie.group === 'Recommended For You');
const actionMovies = movies.filter(movie => movie.group === 'Thrilling movies');
return res.render("categories", {
topMovies,
newMovies,
recMovies,
actionMovies
});
});
我在一个网站上工作,该网站在主页上的不同类别组中显示多部电影,因此我尝试使用多个查找函数 (mongoose) 并将它们传递到渲染中以在视图中一起显示它们。问题是如果我尝试将查找函数中的电影数组存储在变量或 res.locals 中,它只是保持“未定义”状态。我似乎无法弄清楚如何在一个 get 响应中传递其中的几个数组。我是 Node 的新手,非常感谢任何帮助!
app.get("/", (req, res) => {
// array of top-selling movies
Movie.find({
group: "Top-Selling Movies"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
res.locals.topMovies = movies;
}
});
// array of new movies
Movie.find({
group: "New rental movies"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
res.locals.newMovies = movies;
}
});
// array of recommended movies
Movie.find({
group: "Recommended For You"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
res.locals.recMovies = movies;
}
});
// array of action/thrilling movies
Movie.find({
group: "Thrilling movies"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
res.locals.actionMovies = movies;
}
});
res.render("categories");
});
我什至尝试过:
app.get("/", (req, res) => {
var topMovies;
var newMovies;
var recMovies;
var actionMovies;
// array of top-selling movies
Movie.find({
group: "Top-Selling Movies"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
topMovies = movies;
}
});
// array of new movies
Movie.find({
group: "New rental movies"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
newMovies = movies;
}
});
// array of recommended movies
Movie.find({
group: "Recommended For You"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
recMovies = movies;
}
});
// array of action/thrilling movies
Movie.find({
group: "Thrilling movies"
}, function(err, movies) {
if (err) {
console.log(err);
} else {
// In EJS, use found items array and tap into attributes to display in frontend
actionMovies = movies;
}
});
res.render("categories", {
topMovies: topMovies,
newMovies: newMovies,
recMovies: recMovies,
actionMovies: actionMovies
});
你可以使用 async/await
app.get("/", async (req, res) => {
const topMovies = await Movie.find({ group: "Top-Selling Movies" })
const newMovies = await Movie.find({ group: "New rental movies" })
const recMovies = await Movie.find({ group: "Recommended For You" })
const actionMovies = await Movie.find({ group: "Thrilling movies" })
return res.render("categories", {
topMovies: topMovies,
newMovies: newMovies,
recMovies: recMovies,
actionMovies: actionMovies
});
});
或者为了更好看的代码
app.get("/", async (req, res) => {
const [topMovies, newMovies, recMovies, actionMovies] = await Promise.all([
Movie.find({ group: "Top-Selling Movies" }),
Movie.find({ group: "New rental movies" }),
Movie.find({ group: "Recommended For You" }),
Movie.find({ group: "Thrilling movies" })
])
return res.render("categories", {
topMovies,
newMovies,
recMovies,
actionMovies
});
});
编辑:同样在您的示例中,您可以仅使用过滤方法来限制数据库查询
app.get("/", async (req, res) => {
const movies = await Movie.find()
const topMovies = movies.filter(movie => movie.group === 'Top-Selling Movies');
const newMovies = movies.filter(movie => movie.group === 'New rental movies');
const recMovies = movies.filter(movie => movie.group === 'Recommended For You');
const actionMovies = movies.filter(movie => movie.group === 'Thrilling movies');
return res.render("categories", {
topMovies,
newMovies,
recMovies,
actionMovies
});
});