以getHanlder[‘/’]为例,当客户端请求“/”的时候,不是简单地把index.html响应给服务器这么简单,想象一下,一家食品店,每天提供的菜式可能会有所不同,或者因为季节问题而导致每个季节的特色菜都有所不同,所以我们网站主页展示的菜式也可能随之而变化。因此,我们需要根据数据库中存储的主页数据来动态渲染主页的内容。我把idnex.html写成模板,为了不适用jade等模板引擎,我在html里面使用如同“{{foodMenu}}”这种形式的标记,当读取完模板之后,利用简单的字符串操作将标记替换成我们需要动态渲染的内容,即可实现动态渲染HTML的目的。
静态文件之外的其他路由,或者叫控制器(controller),一般都会包含业务逻辑,即业务逻辑一般是在这一层完成的。像上面的根据数据库内容动态渲染出首页,或者你在其他场景下面会见到的如登录注册的数据检验,成功登录之后将客户端重定向到对应的用户界面等等业务逻辑都是在这一层实现。
var fs = require('fs');
var url = require('url');
var querystring = require('querystring');
var foods = require('../model/foods')();
var detail = require('../model/detail')();var getHandler = {};
var postHandler = {};
// 处理对主页的请求
getHandler['/'] = function(req, res) {
var foodMenu = "";
// 拼装首页数据
var food = foods.getAllFoods();
for (var i = 0; i < food.length; ++i) {
foodMenu += '<div class="food-card" id="' + food[i].id + '"><img src="';
foodMenu += food[i].image + '"><h1>' + food[i].name + '</h1><h2>' + food[i].price + '</h2></div>';
}
res.writeHead(200, {"Content-Type": "text/html"});
fs.readFile(__dirname + '/../views/index.html', (err, data) => {
if (err) {
console.log(err);
res.end();
} else {
// 动态渲染模板
res.end(data.toString().replace('{{foodMenu}}', foodMenu));
}
});
};
// 处理对详情页面的请求
getHandler['/detail'] = function(req, res) {
var query = querystring.parse(url.parse(req.url).query);
var foodDetail = detail.getDetail(query.id);
res.writeHead(200, {"Content-Type": "text/html"});
fs.readFile(__dirname + '/../views/detail.html', (err, data) => {
// 动态渲染模板
res.end(data.toString().replace('{{image}}', foodDetail.image)
.replace('{{name}}', foodDetail.name)
.replace('{{description}}', foodDetail.description)
.replace('{{price}}', foodDetail.price));
});
};
// 404响应,告知客户端资源未找到
getHandler['/404'] = function(req, res) {
res.writeHead(404, {"Content-Type": "text/plain"});
res.end("404 Not Found");
};
// post请求的处理方法示例
postHandler['/'] = function(res, data) {









