手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >轻松创建nodejs服务器(9):实现非阻塞操作
轻松创建nodejs服务器(9):实现非阻塞操作
摘要:我们要将response对象(从服务器的回调函数onRequest()获取)通过请求路由传递给请求处理程序。随后,处理程序就可以采用该对象上...

我们要将response对象(从服务器的回调函数onRequest()获取)通过请求路由传递给请求处理程序。随后,处理程序就可以采用该对象上的函数来对请求作出响应。

我们先对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(8888);

console.log("Server has started.");

}

exports.start = start;

我们将response对象作为第三个参数传递给route()函数,并且,我们将onRequest()处理程序中所有有关response的函数调都移除,因为我们希望这部分工作让route()函数来完成。

接下来修改 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("404 Not found");

response.end();

}

}

exports.route = route;

同样的模式:相对此前从请求处理程序中获取返回值,这次取而代之的是直接传递response对象。 如果没有对应的请求处理器处理,我们就直接返回“404”错误。

接下来修改requestHandler.js:

复制代码 代码如下:

var exec = require("child_process").exec;

function start(response) {

console.log("Request handler 'start' was called.");

exec("ls -lah", function (error, stdout, stderr) {

response.writeHead(200, {"Content-Type": "text/plain"});

response.write(stdout);

response.end();

});

}

function upload(response) {

console.log("Request handler 'upload' was called.");

response.writeHead(200, {"Content-Type": "text/plain"});

response.write("Hello Upload");

response.end();

}

exports.start = start;

exports.upload = upload;

我们的处理程序函数需要接收response参数,为了对请求作出直接的响应。 start处理程序在exec()的匿名回调函数中做请求响应的操作,而upload处理程序仍然是简单的回复“Hello World”,只是这次是使用response对象而已。

如果想要证明/start处理程序中耗时的操作不会阻塞对/upload请求作出立即响应的话,可以将requestHandlers.js修改为如下形式:

复制代码 代码如下:

var exec = require("child_process").exec;

function start(response) {

console.log("Request handler 'start' was called.");

exec("find /",

{ timeout: 10000, maxBuffer: 20000*1024 },

function (error, stdout, stderr) {

response.writeHead(200, {"Content-Type": "text/plain"});

response.write(stdout);

response.end();

}

);

}

function upload(response) {

console.log("Request handler 'upload' was called.");

response.writeHead(200, {"Content-Type": "text/plain"});

response.write("Hello Upload");

response.end();

}

exports.start = start;

exports.upload = upload;

这样一来,当请求http://localhost:8888/start的时候,会花10秒钟的时间才载入,而当请求http://localhost:8888/upload的时候,会立即响应,纵然这个时候/start响应还在处理中。

【轻松创建nodejs服务器(9):实现非阻塞操作】相关文章:

jQuery切换所有复选框选中状态的方法

JavaScript中的this,call,apply使用及区别详解

JS实现跳转代码:多域名指向同一空间

自适应图片大小的弹出窗口

nodejs怎么简单实现中英文翻译

总结一些js自定义的函数

jquery中map函数遍历数组用法实例

JavaScript中String.match()方法的使用详解

将HTML自动转为JS代码

Javascript获取统一管理的提示语(message)

精品推荐
分类导航