app.render()可以呈现一组视图吗?

时间:2018-01-22 23:41:07

标签: node.js express

似乎没有记录,我想知道是否可以在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;
})

1 个答案:

答案 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
});