似乎没有记录,我想知道是否可以在Expressjs中渲染多个视图或一组视图,如下所示:
const data = 'some data passed by a DB';
const app = express();
const arrayViews = ['layout','email', 'web'];
app.render(arrayViews, data, (err, html) => {
if (err) throw err;
})
或者我必须在多个实例中执行此操作
app.render('email', data, (err, html) => {
if (err) throw err;
})
app.render('web', data, (err, html) => {
if (err) throw err;
})
答案 0 :(得分:0)
没有。您无法将一组视图传递给app.render()
。 app.render()
的要点是创建一个呈现的HTML片段,可以作为对特定http请求的响应发送。您无法向一个http请求发送多个响应。因此,您只想为任何给定的请求致电res.render()
。
如果您希望针对不同情况提供两种不同类型的响应,则应为每个响应创建单独的路由,并在每个响应中使用适当的模板为该请求调用res.render()
一次。
或者,您可以在URL中传入查询参数,并在路由处理程序中使用if
语句来决定要呈现的模板。但是,重点是您只为每个请求发送一个响应。
例如,在这里查看查询参数以决定要执行的渲染类型:
app.get('/mypage', function(req, res) {
if (req.query.page === "email") {
res.render('email', data);
} else {
res.render('web', data);
}
});
否则,您有两条不同的路线:
app.get('/mypage/email', function(req, res) {
res.render('email', data);
});
app.get('/mypage/web', function(req, res) {
res.render('web', data);
});
我可能最初对您提问的重点感到困惑(因为您没有显示渲染的整体背景或您正在使用它的内容)。
如果您正在使用app.render()
从渲染操作中收集HTML,您可以多次调用它并等待所有操作完成,然后您有多个渲染模板,您可以随意执行任何操作用。但是,单个app.render()
不接受多个模板。您必须多次调用它并等待所有请求完成。
Promise.all([appRender('email'), appRender('web')]).then([email, web] => {
// can access both rendered templates here
// to do with them whatever you want to do
}).catch(err => {
// error here
});
或者,您可以使用它来制作一个带有数组的app.render()
版本:
const util = require('util');
const appRender = util.promisify(app.render.bind(app));
app.renderAll = function(arrayOfTemplates) {
return Promise.all(arrayOfTemplates.map(template => {
return appRender(template);
}));
});
app.renderAll(['email', ['web']]).then([email, web] => {
// can access both rendered templates here
// to do with them whatever you want to do
}).catch(err => {
// error here
});