亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

輕松創(chuàng)建nodejs服務(wù)器(9):實(shí)現(xiàn)非阻塞操作

 更新時(shí)間:2014年12月18日 10:58:09   投稿:junjie  
這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(9):實(shí)現(xiàn)非阻塞操作,本系列文章會(huì)教你一步一步創(chuàng)建一個(gè)完整的服務(wù)器,要的朋友可以參考下

我們要將response對(duì)象(從服務(wù)器的回調(diào)函數(shù)onRequest()獲取)通過(guò)請(qǐng)求路由傳遞給請(qǐng)求處理程序。隨后,處理程序就可以采用該對(duì)象上的函數(shù)來(lái)對(duì)請(qǐng)求作出響應(yīng)。

我們先對(duì)server.js做出修改:

復(fù)制代碼 代碼如下:

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對(duì)象作為第三個(gè)參數(shù)傳遞給route()函數(shù),并且,我們將onRequest()處理程序中所有有關(guān)response的函數(shù)調(diào)都移除,因?yàn)槲覀兿M@部分工作讓route()函數(shù)來(lái)完成。

接下來(lái)修改 router.js:

復(fù)制代碼 代碼如下:

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;

同樣的模式:相對(duì)此前從請(qǐng)求處理程序中獲取返回值,這次取而代之的是直接傳遞response對(duì)象。 如果沒(méi)有對(duì)應(yīng)的請(qǐng)求處理器處理,我們就直接返回“404”錯(cuò)誤。

接下來(lái)修改requestHandler.js:

復(fù)制代碼 代碼如下:

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;

我們的處理程序函數(shù)需要接收response參數(shù),為了對(duì)請(qǐng)求作出直接的響應(yīng)。 start處理程序在exec()的匿名回調(diào)函數(shù)中做請(qǐng)求響應(yīng)的操作,而upload處理程序仍然是簡(jiǎn)單的回復(fù)“Hello World”,只是這次是使用response對(duì)象而已。

如果想要證明/start處理程序中耗時(shí)的操作不會(huì)阻塞對(duì)/upload請(qǐng)求作出立即響應(yīng)的話,可以將requestHandlers.js修改為如下形式:

復(fù)制代碼 代碼如下:

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;

這樣一來(lái),當(dāng)請(qǐng)求http://localhost:8888/start的時(shí)候,會(huì)花10秒鐘的時(shí)間才載入,而當(dāng)請(qǐng)求http://localhost:8888/upload的時(shí)候,會(huì)立即響應(yīng),縱然這個(gè)時(shí)候/start響應(yīng)還在處理中。

相關(guān)文章

  • 使用Node.js實(shí)現(xiàn)遍歷文件夾下所有文件

    使用Node.js實(shí)現(xiàn)遍歷文件夾下所有文件

    在使用Node.js處理文件或文件夾時(shí),我們有時(shí)需要遍歷文件夾中的所有文件和子文件夾以查找特定的文件或執(zhí)行某些操作,這里將提供一些基本的例子來(lái)演示如何使用Node.js遍歷文件夾,需要的朋友可以參考下
    2023-08-08
  • Node.js dgram模塊實(shí)現(xiàn)UDP通信示例代碼

    Node.js dgram模塊實(shí)現(xiàn)UDP通信示例代碼

    這篇文章主要介紹了Node.js dgram模塊實(shí)現(xiàn)UDP通信示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 深入理解Node.js中通用基礎(chǔ)設(shè)計(jì)模式

    深入理解Node.js中通用基礎(chǔ)設(shè)計(jì)模式

    大家在談到設(shè)計(jì)模式時(shí)最先想到的就是 singletons, observers(觀察者) 或 factories(工廠方法)。本文重點(diǎn)給大家介紹Node.JS一些基礎(chǔ)模式的實(shí)現(xiàn)方法,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2017-09-09
  • NPM全局安裝與本地安裝的區(qū)別詳析

    NPM全局安裝與本地安裝的區(qū)別詳析

    NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于NPM全局安裝與本地安裝區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Nodejs libuv運(yùn)行原理詳解

    Nodejs libuv運(yùn)行原理詳解

    在本篇文章里小編給大家整理的是關(guān)于Nodejs libuv運(yùn)行原理以及相關(guān)知識(shí)點(diǎn),有需要的朋友們可以學(xué)習(xí)下。
    2019-08-08
  • 詳解axios在node.js中的post使用

    詳解axios在node.js中的post使用

    最近因?yàn)楣ぷ鞯脑蛟趯W(xué)習(xí)使用網(wǎng)絡(luò)請(qǐng)求庫(kù),因?yàn)檫@個(gè)項(xiàng)目用的是Promise,所以就選擇了axios,下面這篇文章主要給大家介紹了關(guān)于axios在node.js中的post使用的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-04-04
  • puppeteer實(shí)現(xiàn)html截圖的示例代碼

    puppeteer實(shí)現(xiàn)html截圖的示例代碼

    通過(guò)Puppeteer的提供的api直接控制Chrome模擬大部分用戶操作來(lái)進(jìn)行UI Test或者作為爬蟲(chóng)訪問(wèn)頁(yè)面來(lái)收集數(shù)據(jù),這篇文章主要介紹了puppeteer實(shí)現(xiàn)截圖的示例代碼,感興趣的可以了解一下
    2019-01-01
  • Node端異常捕獲的實(shí)現(xiàn)方法

    Node端異常捕獲的實(shí)現(xiàn)方法

    本文主要介紹了Node端異常捕獲的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 詳解NodeJs支付寶移動(dòng)支付簽名及驗(yàn)簽

    詳解NodeJs支付寶移動(dòng)支付簽名及驗(yàn)簽

    本文主要介紹了NodeJs支付寶移動(dòng)支付簽名及驗(yàn)簽的方法,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • 用npm install時(shí)報(bào)錯(cuò)node-sass npm ERR command failed問(wèn)題的解決方法

    用npm install時(shí)報(bào)錯(cuò)node-sass npm ERR command

    在用npm install時(shí)報(bào)錯(cuò)npm ERR! path D:…\node-sass和npm ERR! command failed 問(wèn)題,本文給大家介紹了如何解決這個(gè)問(wèn)題,文中通過(guò)圖文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03

最新評(píng)論