轻量级Web框架Node.js和bottle(2)

四.对不同的请求进行路由

当我们在使用node.js进行开发时,由于node.js是单线程的,所以对于耗时的操作,我们将它封装成函数采用回调函数的方式进行调用,这样可以让代码继续往下执行。当把耗时操作放在回调函数中,当耗时操作执行完毕后,回调函数会继续执行其函数内剩余的代码,它不会耽误回调函数外其他方法(请求)的执行。这个就是传说中的 回调 。我们给某个方法传递了一个函数,这个方法在有相应事件发生时调用这个函数来进行回调。这就是事件驱动的异步服务器端JavaScript和它的回调啦!

一个很好的node.js的入门资料,分享给大家,参考链接为:

下面介绍该资料中的一个例子,对不同的请求(url)进行相应的处理(路由)。它包含4个文件,index.js、server.js、router.js和requestHandlers.js。

其中index.js是定义了不同请求(url)的相应的处理(路由)方法,和启动webserver。

index.js的代码如下:

var server = require("./server");
var router = require("./router");
var requestHandlers = require("./requestHandlers");

var handle = {};
handle["/"] = requestHandlers.start;
handle["/start"] = requestHandlers.start;
handle["/upload"] = requestHandlers.upload;

server.start(router.route, handle);

server.js是server的创建和启动的实现。server.js的代码如下:

var http = require("http");
var url = require("url");

function start(route, handle) {
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname;
console.log("Request for " + pathname + " received.");

route(handle, pathname, response);
}

http.createServer(onRequest).listen(65535);
console.log('Server has started.');
}

exports.start = start;

上面的onRequest函数就是回调函数。
回调函数就是将一个函数f1作为函数f2的参数进行调用,这样f2就不会因为f1的耗时操作而影响下面代码的执行,f1会等待相应事件的触发,即f1和f2会并行执行。

router.js是对不同的url调用函数(即下面的handler[pathname](response))进行处理。router.js的代码如下:

function route(handle, pathname, response) {
console.log("About to route a request for "+ pathname);
if (typeof handle[pathname] == 'function') {
handle[pathname](response);
} else {
console.log("No request handler found for " + pathname);
response.writeHead(404,{'Content-Type': 'text/plain'});
response.write('node.js: 404 Not found');
response.end();
}
}

exports.route = route;

requestHandlers.js是不同url调用(路由)的方法的具体实现。requestHandlers.js的代码如下:

function start(response) {
console.log("Request handler 'start' was called.");
response.writeHead(200, {'Content-Type': 'text/plain'});
response.write("node.js: hello,start");
response.end();
}

function upload(response){
console.log("Request handler 'upload' was called.");
response.writeHead(200, {'Content-Type': 'text/plain'});
response.write("node.js: hello,upload");
response.end();
}

exports.start = start;
exports.upload = upload;

运行这个例子的命令为:node index.js

当请求::65535/后的运行结果如下:

轻量级Web框架Node.js和bottle

当请求::65535/upload后的运行结果如下:

轻量级Web框架Node.js和bottle

代码链接:https://github.com/zhaolincheung/nodejs_demo

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/495aab4c65932626fe0f66e03cd1c2ec.html