国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

輕松創(chuàng)建nodejs服務器(9):實現非阻塞操作

2019-11-20 13:40:14
字體:
來源:轉載
供稿:網友

我們要將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響應還在處理中。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 铜梁县| 滁州市| 汕头市| 龙游县| 英德市| 霍州市| 龙门县| 丹寨县| 隆化县| 合肥市| 三明市| 平乐县| 南部县| 雅安市| 全椒县| 磐安县| 阿尔山市| 河曲县| 贡嘎县| 赤壁市| 正阳县| 永胜县| 廊坊市| 天门市| 中卫市| 宁明县| 常州市| 兰西县| 龙井市| 江城| 娱乐| 堆龙德庆县| 屯门区| 琼结县| 潮安县| 翼城县| 磐石市| 淮南市| 集贤县| 涿鹿县| 周至县|