本课教你创建 服务器的 路由功能
如果你以前用过其它语言的框架,应该对路由不会陌生
比如 PHP的 Laravel里专门有个routes.php用来配置路由信息,形如:
如果你以前用过其它语言的框架,应该对路由不会陌生
比如 PHP的 Laravel里专门有个routes.php用来配置路由信息,形如:
<?php
/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the Closure to execute when that URI is requested.
|
*/
Route::get('/', function()
{
return View::make('hello');
});
Route::get ('DZGame/ID101/{operation}', 'DZGame\ID101\Controller@main');
我们之前课程中已经建立了一个服务器,不过服务器 只有一单一功能 就是在浏览器中返回一点信息。
那么要丰富服务器就必须要增加不同访问路径对应的不同服务。
比如 访问 /about 就返回 鲍勃的个人资料, 访问 /jokes就返回点笑话什么的。
什么,你说直接写在服务器里? 当然可以。
不过么假如我有一万个路径对应一万个服务呢, 都写在server.js里你能维护得了么? 能的话就不用往下看了。
你说不能, 好吧,这才实话。
路由就是根据不同的访问地址,返回不同的服务。 那我们就开始写一个路由模块吧。
复习一下第四课,创建模块的两要素
1. 名称。 要不然别人怎么引用呐。
2. 接口。 别人根据名称调用相应的接口。
怎么样,想起来了吧。 是不是很easy. 名字我们就叫 routes , 接口就叫 get好了 (学习一下laravel)。
实在太简单了,请看routes.js
function get(pathname){
console.log("routes to :"+pathname);
};
exports.get = get;
那么怎么使用呢,也非常简单, 在需要的地方调用
var routes = require("./routes");
routes.get('/about');
且慢! “需要的地方” 是哪个地方? !
这是个看似无聊,实际非常好的问题。
放在server.js 的createServer的匿名响应函数中怎么样?
没问题, 可以得到正确的结果。 并且看上去像一个很顺理成章想到的 应该的位置。
function start(){
var http = require("http");
var url = require("url");
var querystring = require("querystring");
var routes = require("./routes");
routes.get("/about");
var server = http.createServer(function(request, response){
response.writeHead(200, {"Content-Type":"text/plain"});
var url_obj = url.parse(request.url);
response.write("\n pathname:"+url_obj.pathname);
response.write("\n query:"+url_obj.query);
var qs = querystring.parse(url_obj.query);
response.write("\n a:"+qs["a"]);
response.write("\n b:"+qs.b);
response.write("\n c:"+qs.c);
response.end();
});
server.listen(8888);
}
exports.start = start;
但是,并不好。 为什么? 参考前一篇文件 什么叫 控制反转
为了能让server模块 和 routes 模块进一步解耦,我们采用更松散和 依赖注入 方式。
首先, 我们先把server.js里的start函数改造一下, 把路由接口函数get传递过去
function start(get){
var http = require("http");
var url = require("url");
var querystring = require("querystring");
var server = http.createServer(function(request, response){
response.writeHead(200, {"Content-Type":"text/plain"});
var url_obj = url.parse(request.url);
response.write("\n pathname:"+url_obj.pathname);
response.write("\n query:"+url_obj.query);
get(url_obj.pathname);
var qs = querystring.parse(url_obj.query);
response.write("\n a:"+qs["a"]);
response.write("\n b:"+qs.b);
response.write("\n c:"+qs.c);
response.end();
});
server.listen(8888);
}
exports.start = start;
接着,需要在index.js里把routes的接口函数get传递给server模块
var server = require("./server");
var routes = require("./routes");
server.start( routes.get );
好了,在CLI里运行一下 node index.js 开启服务 ,浏览器中访问 http://localhost:8888/abcd?c=xx&b=joke&a=8
CLI里有以下输出就说明路由已经运行OK 了 :)
$ node index
routes to :/abcd
routes to :/favicon.ico
好了,收工之前。 有两个问题请问一下大家
1. 这个依赖注入是三种方式的哪一种呢?
2. 为什么注入的不是 routes ,而是接口get呢, 注入routes, 再调用 routes.get()不行么
这两个问题属于进阶问题, 不知道也不要紧,丝毫不会影响我们继续学习node.js
如果有探讨的同志,欢迎回复
CLI里有以下输出就说明路由已经运行OK 了 :)
$ node index
routes to :/abcd
routes to :/favicon.ico
好了,收工之前。 有两个问题请问一下大家
1. 这个依赖注入是三种方式的哪一种呢?
2. 为什么注入的不是 routes ,而是接口get呢, 注入routes, 再调用 routes.get()不行么
这两个问题属于进阶问题, 不知道也不要紧,丝毫不会影响我们继续学习node.js
如果有探讨的同志,欢迎回复