如果要使用页面和页面路由,请使用WebApp来创建http服务,APIServer不提供页面渲染的功能。
页面路由代码需要定义在server/router目录或其子目录中,weroll启动时会自动解析并注册到Express中。一个典型的路由文件如下:
//./server/router/index.js
function renderIndexPage(req, res, output, user)
//在页面中使用 可显示hello字符串
output({ msg:"hello!" });
}
function renderProfilePage(req, res, output, user) {
output({ nickname:user.nickname, head:user.head });
}
exports.getRouterMap = function() {
return [
/*
url 浏览器url中域名之后的地址
view 对应要渲染的html页面,如index就表示 %项目目录%/client/views/index.html这个页面
handle http GET方式对应的处理方法
postHandle http POST方式对应的处理方法
needLogin 是否需要登录才能访问 true/false
loginPage 如果没有访问权限,可以指定一个跳转页面,默认是login页面和view一样,
页面定义在 %项目目录%/client/views目录或子目录中
*/
{ url: "/", view: "index", handle: renderIndexPage, needLogin:false },
{ url: "/index", view: "index", handle: renderIndexPage, needLogin:false },
{ url: "/profile", view: "profile", handle: renderProfilePage, needLogin:true, loginPage:"signin" }
];
}
weroll默认使用 nunjucks 作为模板引擎,请参考nunjucks官方文档。你也可以使用其他的模板引擎如jade, ejs, swig等,示例代码如下:
//这是main.js中的代码片段
//var Setting = global.SETTING;
Setting.viewEngine = {
//webApp: an instance of Express
init: function(webApp, viewPath, useCache) {
var engine = {};
//务必要实现这个方法
engine.$setFilter = function(key, func) {
//do nothing
};
webApp.set('view engine', 'ejs');
console.log("use view engine: ejs");
return engine;
}
};
//create and start a web application
var webApp = require("weroll/web/WebApp").start(Setting);
在路由的处理方法中,使用output即可输出数据。
//./server/router/index.js
function renderIndexPage(req, res, output, user)
//在页面中使用 可显示hello字符串
output({ msg:"hello!" });
}
<!-- ./client/views/index.html -->
<div>{{data.msg}}</div> <!-- display "hello!" -->
在页面中对象即是output传递出去的对象,weroll还封装了一些常用的数据传递到页面中。如URL的querystring数据:
<!-- ./client/views/index.html -->
<!-- URL: http://localhost:3000/some_page?page=2&size=10 -->
<div>page: {{query.page}}</div> <!-- display "2" -->
<div>size: {{query.size}}</div> <!-- display "10" -->
获取服务器当前的时间戳:
<!-- ./client/views/index.html -->
<div>Server Time: {{now}}</div>
获取./server/config/%ENV%/setting.js 里的一些配置数据,如:
<!-- ./client/views/index.html -->
<div>Site Domain: {{setting.SITE}}</div> <!-- 网站域名 -->
<div>Resource CDN: {{setting.RES_CDN_DOMAIN}}</div> <!-- 静态资源CDN域名 -->
<div>Site Domain: {{setting.API_GATEWAY}}</div> <!-- API Gateway的URL地址 -->
你也可以自定义或者扩展setting里的数据:
//./main.js
require("weroll/web/WebApp").start(Setting, function(webApp) {
webApp.COMMON_RESPONSE_DATA.defaultStyle = "blue";
});
<!-- ./client/views/index.html -->
<link type="text/css" rel="stylesheet"
href="{{setting.RES_CDN_DOMAIN}}/css/{{setting.defaultStyle}}.css" ></link>
通过 ViewEngineFilter.addFilter() 可以添加自定义过滤器,这里以nunjucks为例:
//./server/router/index.js
var ViewEngineFilter = require("weroll/utils/ViewEngineFilter");
//第一个参数是过滤器的名字,第二个参数是function
ViewEngineFilter.addFilter("json", json);
//在页面中正确渲染json数据
function json(val, express) {
return this.env.getFilter("safe")(JSON.stringify(val));
}
//the render function of page
function renderSomePage(req, res, params) {
output({ list:[ "Jay", "Tracy" ] });
}
<!-- ./client/views/some_page.html -->
<script>
var list = {{data.list|json}};
console.log(list[0]); //echo Jay
</script>