使用callback函数返回string而不是HTML

我是Nose.JS的nooby用户与明确的框架,我尝试做这个层次结构的HTML引擎:

<template> <layout> <view> </layout> </template> 

所以,这是我的server.js文件(croped):

 var express = require('express') , http = require('http'); var app = module.exports = express(); app.configure(function() { app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.engine('html', require('ejs').renderFile); app.use(express.favicon()); app.use(express.static(__dirname + '/public')); }); // Routes app.get('/', function(req, res) { var data = { /* Some data here */ }; /* Probleme start here : * I want render the view HTML, * then render the layout HTML with the view content, * then render the template to display */ res.render('view', data, function(err, view) { data.view = view; res.render('layout', data, function(err, layout) { data.layout = layout; res.render('template', data); }); }); }); 

就像我说的代码:我想呈现视图的HTML,然后呈现与视图内容的布局HTML,然后呈现模板显示。 但data.viewdata.layout是string,而不是HTML(如: HEADER<br/>Menu<br/> ),所以如果我把HTML代码放在这个文件上,我在最后一页上有HTML代码。

—– [编辑:添加.ejs文件] —–

template.ejs

 <div><%= layout %></div> 

layout.ejs

 HEADER<br/> Menu<br/> <%= view %> FOOTER 

view.ejs

 <p>View</p> 

怎样才能得到data.viewdata.layout的HTML显示结果?

谢谢大家,对我的英语感到抱歉

亚瑟

FWIW这是我用来在Express 4中获得布局支持的东西(用ejstesting过):

 /* Usage: Set a global/default layout with: app.set('view layout', 'bar'); Set a layout per-render (overrides global layout) with: res.render('foo', { layout: 'bar' }); Or disable a layout if a global layout is set with: res.render('foo', { layout: false }); If no layout is provided using either of the above methods, then the view will be rendered as-is like normal. Inside your layout, the variable `body` holds the rendered partial/child view. Installation: Call `mpResponse();` before doing `require('express');` in your application. */ function mpResponse() { var expressResponse = require('express/lib/response'), expressResRender = expressResponse.render; expressResponse.render = function(view, options, fn) { options = options || {}; var self = this, req = this.req, app = req.app, layout, cb; // support callback function as second arg if (typeof options === 'function') fn = options, options = {}; // merge res.locals options._locals = self.locals; // default callback to respond fn = fn || function(err, str) { if (err) return req.next(err); self.send(str); }; if (typeof options.layout === 'string') layout = options.layout; else if (options.layout !== false && typeof app.get('view layout') === 'string') layout = app.get('view layout'); if (layout) { cb = function(err, str) { if (err) return req.next(err); options.body = str; expressResRender.call(self, layout, options, fn); }; } else cb = fn; // render app.render(view, options, cb); }; }