先说说路由是干嘛的。
路由就是把对应的请求地址,指定到对应的处理方法上。
因此,要为路由提供请求的URL和其他需要的GET以及POST参数,然后路由根据这些数据
执行相应的代码。
下面问题来了,既然路由需要请求URL和参数,该怎么获取URL请求路径和参数呢?
我们需要的所有的数据都包含在request对象中,该对象最为onRequest()回调函数的第一个参数传递
解析URL和参数用到了Node.js其他模块: url 、 querystring 。
下面分别介绍如何使用 url 和 querystring 获取参数。
- url 获取请求的路径与参数
示例:
http://localhost:8888/start?name=jim&age=22
url.parse(string).pathname → /start
url.parse(string).query → name=jim&age=22
代码示例如下:
// 引入 http模块
var http = require('http');
// 引入 url 模块
var url = require('url');
// 匿名函数作为参数传递给http.createServer()
http.createServer(function(request,response){
// 设置 charset=utf-8 否则会乱码
response.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'});
// /start?name=jim&age=22
console.log("request.url: "+request.url);
// 获取访问的路径 /start
var pathname = url.parse(request.url).pathname;
// 获取参数值 name: jim , age: 12
var params = url.parse(request.url,true).query; // true 不能缺少,否则会报错
response.write("访问路径pathname: "+pathname+"\n");
response.write("姓名name: "+params.name+"\n");
response.write("年龄age: "+params.age);
console.log("访问路径pathname:"+pathname+"\n"+"姓名name:"+params.name+"\n"+"年龄age:"+params.age);
response.end();
}).listen(8888);
console.log('server is running http://127.0.0.1:8888/start?name=jim&age=22');
运行结果:
server is running http://127.0.0.1:8888/start?name=jim&age=22
request.url: /start?name=jim&age=22
访问路径pathname: /start
姓名name: jim
年龄age: 22
2.querystring 获取请求的路劲与参数
示例:
http://localhost:8888/start?name=jim&age=22
querystring.parse(string)['name'] → jim
querystring.parse(string)['age'] → 22
示例代码:
// 引入http模块
var http = require('http');
// 引入querystring模块
var querystring = require('querystring');
// 匿名函数作为参数传递给http.createServer()
http.createServer(function(request,response){
// 设置 charset=utf-8 否则会乱码
response.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'});
// /start?name=jim&age=22
console.log("request.url: "+request.url);
var name = querystring.parse(request.url)['/start?name'];
var age = querystring.parse(request.url)['age'];
response.write("name:"+name+"\n");
response.write("age:"+age+"\n");
response.end();
console.log("姓名name: "+name+"\n"+"年龄age: "+age);
var obj = querystring.parse(request.url);
console.log("obj: "+JSON.stringify(obj, null, 4));
}).listen(8888)
console.log('server is running http://127.0.0.1:8888/start?name=jim&age=22');
运行结果:
server is running http://127.0.0.1:8888/start?name=jim&age=22
request.url: /start?name=jim&age=22
姓名name: jim
年龄age: 22
obj: {
"/start?name": "jim",
"age": "22"
}
以上我们可以通过请求的URL路径区别不同的请求了,然后将请求以URL路径为基准映射到处理程序上使用
不同的代码来处理。
接下来我们编写一个路由用以获取请求的URL路径,并且把路由与服务器整合起来。
编写路由就是编写一个js文件,并且作为一个模块,我们知道Node.js中一个文件其实就是一个模块。
创建一个router.js文件作为一个模块,代码如下:
function route(pathname){
console.log("request path is "+pathname);
}
exports.route = route;
接下来我们编写一个server.js文件,作为一个模块,扩展一下服务器的start()函数,然后将路由函数做为
一个参数传递到start()函数中,server.js代码如下:
// 引入http模块
var http = require('http');
// 引入 url 模块
var url = require('url');
// 这里start函数的参数route也是一个函数,函数定义在router.js文件中
function start(route){
function onRequest(request,response){
//通过url模块获取请求路径
var pathname = url.parse(request.url).pathname;
console.log('Request for '+pathname+' received.');
// 将请求路径传递给路由函数
route(pathname);
response.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'});
response.write('Hello,三疯');
response.end();
}
http.createServer(onRequest).listen(8888);
console.log('Server has started.');
}
exports.start = start;
同时,我们创建index.js文件,使得路由函数注入到服务器中,
index.js文件代码如下:
// 引入 server模块儿
var server = require('E:\\nodejs\\server');
// 引入路由模块儿
var router = require('E:\\nodejs\\router');
server.start(router.route);
运行结果:
Server is started.
Request for /start received.