上一节我们实现了简单的路由,这节我们实现更复杂的路由过程
统一管理
我们在server.js
初始化路由控制,启动脚本的模块。
var server = require('./start');
var router = require('./router');
var requestHandlers = require('./handlers');
var handler = [];
handler["/"] = requestHandlers.home;
handler["/show"] = requestHandlers.show;
handler["/upload"] = requestHandlers.upload;
server.start(router.route,handler);
console.log("Run on port 1337");
启动脚本
在server.js
最后,我们调用了start
模块,start
模块即start.js
文件。在start.js
文件中处理,代码如下
var http = require('http');
var url = require('url');
function start(route,handler) {
console.log("Starting~~");
function onRequest(req, res) {
var pathname = url.parse(req.url).pathname;
var content = route(pathname,handler);
if (content){
res.writeHead(200,{
"Content-Type":"text/plain"
});
res.write('OK');
res.end();
}else {
res.writeHead(404,{
"Content-Type":"text/plain"
});
res.write("404 not found");
res.end();
}
}
var port = process.env.port || 1337;
http.createServer(onRequest).listen(port);
console.log("Started!!");
}
exports.start = start;
这里的核心代码是调用router(pathname,handler);
这个方法,这个方法是在router
模块中实现。
调用路由对应的方法
router
模块中判断参数pathname
和handler
组合成的路径是否有实现。如果有,则调用相应的路由方法,router.js
代码如下
function route(pathname,handler) {
console.log("Route for path requested:" + pathname);
if (pathname == undefined) pathname="/";
if (handler){
if (typeof handler[pathname] === 'function'){
handler[pathname]();
return true;
}else {
console.log("No Method found for " + pathname);
return null;
}
}else {
console.log("No Method found in handler ");
return null;
}
}
exports.route = route;
多个路由方法
首先我们需要定义多个路由方法,为了方便统一的管理控制,我们将路由处理的方法都写在一个handlers.js
的文件中,首先定义三个方法,这里只是实现最简单的打印
function home() {
console.log("Request 'home' called.");
}
function show() {
console.log("Request 'show' called.");
}
function upload() {
console.log("Request 'upload' called.");
}
exports.home = home;
exports.show = show;
exports.upload = upload;
最后
我们在浏览器中输入http://127.0.0.1:1337/
和http://127.0.0.1:1337/show
,可以看到浏览器页面显示OK,命令行打印相应的log.
在项目中:
1.server.js预定义处理路由方法,然后调用启动服务器的方法(start.js)。
2.start.js负责启动服务,解析url传递过来的路径,将url传递给router.js。
3.router.js去判断路由是否正确,然后调用对应url的处理方法,处理方法实现在handlers.js。
4.handlers.js进行真正的路由处理。
这样,我们就手动实现了一个nodejs路由控制的示例。