1.Link
1.1 JavaScript中的函数传递
1.1.1 一个函数可以作为另一个函数接收一个参数,我们可以先定义一个函数,然后传递,也可以在传递参数的地方直接定义函数(匿名函数)。
var http = require("http");
//createServer调用function(request,response)这个函数
http.createServer(
function(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
//也可写为如下方式
var http=require("http");
//定义函数
function requestFunc(request,server){
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
};
//触发回调函数
http.createServer(requestFunc).listen(8888);
整段代码的含义是定义了一个本地变量http,接收http模块,再进行各种操作。个人理解更像是已定义一个类,然后实例化一个对象继承这个类的所有方法,并执行。
这里引入了回调的概念,给某个方法传递了一个函数,这个方法在有相应事件发生时调用这个函数来进行回调 。
对于requestFunc的语句解析:
当收到请求时,使用 response.writeHead() 函数发送一个HTTP状态200和HTTP头的内容类型(content-type),使用 response.write() 函数在HTTP相应主体中发送文本“Hello World"。最后,我们调用 response.end() 完成响应。
1.2 将服务器脚本封装,创建主脚本index.js
1.2.1 server.js 文件内容
var http = require("http");
function start() {
function onRequest(request, response) {
console.log("Request received.");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}
http.createServer(onRequest).listen(8888);
console.log("Server has started.");
}
exports.start = start;
1.2.2 index.js文件内内容
//找到server文件并调用
var server=require("./server");
server.start();
1.3 解析路由
建立router.js文件,用来打印输出请求到的url
function route(pathname){
console.log("request for"+pathname);
}
exports.route=route
更新server.js 文件
var http = require("http");
var url=require("url")
//start函数调用router中的route函数
function start(route) {
function onRequest(request, response) {
var pathname=url.parse(request.url).pathname;
console.log("request for "+pathname);
route(pathname);
console.log("Request received.");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}
http.createServer(onRequest).listen(8888);
console.log("Server has started.");
}
exports.start = start;
更新 index.js 文件,注意:不要将router.route写成router.route(),一直报错route is not a function我还寻思了半天。
var server=require("./server");
var router = require("./router");
server.start(router.route);
再在cmd里运行并打开浏览器运行 https://localhost:8888 就可以得到这样子的结果~
1.4 耦合
请求处理的程序太多,因此将众多请求进行整合。
新建requestHandlers.js 文件,将 start 与 upload 等等请求进行写入
function start() {
console.log("Request handler 'start' was called.");
return "Hello Start";
}
function upload() {
console.log("Request handler 'upload' was called.");
return "Hello Upload";
}
exports.start = start;
exports.upload = upload;
更新 index.js 文件:
var router=require("./router")
var server=require("./server")
var handle={}
handle["/"]= requestHandlers.start
handle["/start"]=requestHandlers.start
handle["/upload"]=requestHandlers.upload
server.start(router.route,handle)
更新server.js 文件
var http=require("http")
var url=request("url")
function start(route,handle){
function(request,response){
var pathname=url.parse(request.url).pathname;
console.log("request for "+pathname+" received");
response.writeHead(200, {"Content-Type": "text/plain"});
var content = route(handle, pathname)
response.write(content);
response.end();
}
http.createServer(onRequest).listen(8888);
console.log("Server has started.");
}
exports.start=start;
更新router.js 文件
function route(handle,pathname){
console.log("About to route a request for " + pathname);
if(typeof handle[pathname] === 'function')
{
handle[pathname]();
}
else {
console.log("No request handler found for " + pathname);
}
}
exports.route=route;