Nodejs中,一个app.get里,怎么才能把数据中不同的两个集合输出到页面上?
Nodejs中,一个app.get里,怎么才能把数据中不同的两个集合输出到页面上?
app.get(’/test’,function(req, res){ category.getTen(function (err, posts) { res.render(‘test’, { //title: ‘分类管理’, posts: posts, user: req.session.user, success: req.flash(‘success’).toString(), error: req.flash(‘error’).toString() }); }) category.getCat(function (err, pers) { res.render(‘test’, { title: ‘分类管理’, pers: pers, user: req.session.user, success: req.flash(‘success’).toString(), error: req.flash(‘error’).toString() }); })
});
代码如上,两个方法分别加载两个集合的数据,如果单独写没问题,但两个写在一起,就碰到问题了,求解决指导。
在Node.js的Express框架中,如果你想在一个app.get
路由处理函数中同时获取并渲染两个不同的数据集,你需要确保这两个异步操作都完成后再进行渲染。这可以通过使用回调函数或Promise来实现。
示例代码
const express = require('express');
const category = require('./models/category'); // 假设这是你的模型文件
const app = express();
app.get('/test', function(req, res) {
Promise.all([
new Promise((resolve, reject) => {
category.getTen(function(err, posts) {
if (err) return reject(err);
resolve(posts);
});
}),
new Promise((resolve, reject) => {
category.getCat(function(err, pers) {
if (err) return reject(err);
resolve(pers);
});
})
]).then(([posts, pers]) => {
res.render('test', {
title: '分类管理',
posts: posts,
pers: pers,
user: req.session.user,
success: req.flash('success').toString(),
error: req.flash('error').toString()
});
}).catch(err => {
console.error(err);
res.status(500).send('服务器错误');
});
});
module.exports = app;
解释
-
使用Promise.all:
Promise.all
允许你同时执行多个异步操作,并等待它们全部完成。它接收一个包含多个Promise的数组作为参数。
-
封装异步操作为Promise:
- 在这里,我们将
category.getTen
和category.getCat
方法封装为Promise。这样我们可以用.then()
来处理成功的情况,用.catch()
来处理失败的情况。
- 在这里,我们将
-
解构赋值:
- 在
.then()
的回调函数中,我们使用解构赋值([posts, pers])
来直接从Promise的结果中提取posts
和pers
。
- 在
-
错误处理:
- 如果任一异步操作失败,
.catch()
将捕获错误,并返回一个500状态码给客户端。
- 如果任一异步操作失败,
通过这种方式,你可以确保在渲染视图之前,所有的数据都已经准备好。
你这种情况用async.parallel就行
Q也可以。
-
代码中无法 res.render 两次。根据你的代码,两个 res.render 随机一个执行,另一个无效。
-
应该先获取 ten 和 cat,等两样都获取时,再一起 render。
-
如果用串行思维,那么把下面那句 getCat 嵌套在 getTen 里面就好了。
-
如果并行,可以去试试 async 或者 eventproxy。我个人喜欢后者。
谢谢,我使用你说的async方法, app.get(’/test’,function(req, res){ category.getCat(function (err, results) { res.render(‘test’, { title: ‘分类管理’, pers: results.one, posts: results.two, user: req.session.user, success: req.flash(‘success’).toString(), error: req.flash(‘error’).toString() }); })
});
后面是这样的,
var date = {}; async.parallel({ one: function(callback) { setTimeout(function(){ PersonModel.find(function(err,persons){ console.log(“1”); //console.log(persons); callback(null, persons); }); },100); },
two: function(callback) { setTimeout(function(){ PostModel.find({“title”:“aa”},function(err,posts){ console.log(“2”); //console.log(posts); callback(null, posts); }); },200); } }, function(err,results){ //return results; //callback(null, results); //console.log(results); date = results; }) console.log(date); category.getCat = function(callback) { console.log(“2”+date); callback(null, date); }
如果你觉得我的代码有改进或者优化的地方,请不吝指出,谢谢
恩,你解释的很到位,你说的第二种方法我尝试过,但未能成功(而且这种方法应该不是很提倡吧)。第三种也试过,貌似也没成功。然后用了你指的第四种方法,成功了。谢谢指出
在Node.js中,如果你想在一个app.get
路由处理函数中同时获取两个集合的数据并将其渲染到页面上,你需要确保这两个异步操作都已完成后再调用res.render
。你可以使用Promise或async/await来实现这一点。
示例代码
const express = require('express');
const category = require('./models/category'); // 假设这是你的模型
app.get('/test', async function(req, res) {
try {
const [posts, pers] = await Promise.all([
category.getTen(),
category.getCat()
]);
res.render('test', {
title: '分类管理',
posts: posts,
pers: pers,
user: req.session.user,
success: req.flash('success').toString(),
error: req.flash('error').toString()
});
} catch (err) {
console.error(err);
res.status(500).send('服务器错误');
}
});
解释
-
使用
Promise.all
:Promise.all
接收一个数组,并返回一个新的Promise。当数组中的所有Promise都成功完成时,新的Promise才会解析为这些Promise的结果数组。如果有任何一个Promise失败,则新的Promise立即失败,并带有第一个失败的错误信息。 -
使用
async/await
:async
函数可以简化异步代码的编写。通过将Promise.all
包裹在try/catch
块中,我们可以更容易地处理可能发生的任何错误。 -
同时获取数据:通过这种方式,我们可以在一次请求中同时获取
posts
和pers
的数据,并将它们一起传递给模板进行渲染。
这样,你就可以在同一个页面上显示来自两个不同集合的数据了。