最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

零基礎(chǔ)之Node.js搭建API服務(wù)器的詳解

 更新時(shí)間:2019年03月08日 11:35:50   作者:沙沙羅曼  
今天小編就為大家分享一篇關(guān)于零基礎(chǔ)之Node.js搭建API服務(wù)器的詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

零基礎(chǔ)之Node.js搭建API服務(wù)器

這篇文章寫(xiě)給那些Node.js零基礎(chǔ),但希望自己動(dòng)手實(shí)現(xiàn)服務(wù)器API的前端開(kāi)發(fā)者,嘗試幫大家打開(kāi)一扇門。

HTTP服務(wù)器實(shí)現(xiàn)原理

HTTP服務(wù)器之所以能提供前端使用的API,其實(shí)現(xiàn)原理是服務(wù)器保持監(jiān)聽(tīng)計(jì)算機(jī)的某個(gè)端口(通常是80),等待客戶端請(qǐng)求,當(dāng)請(qǐng)求到達(dá)并經(jīng)過(guò)一系列處理后,服務(wù)器發(fā)送響應(yīng)數(shù)據(jù)給到前端。

平時(shí)大家通過(guò)Ajax調(diào)用API,即是發(fā)起一次請(qǐng)求,經(jīng)過(guò)服務(wù)器處理后,得到結(jié)果,然后再進(jìn)行前端處理。如今使用高級(jí)編程語(yǔ)言,要實(shí)現(xiàn)服務(wù)器那部分功能已經(jīng)變得非常簡(jiǎn)單,接下來(lái)我們了解一下使用Node.js如何實(shí)現(xiàn)。

什么是Node.js?它可以做什么?

Node.js是一個(gè)JavaScript的運(yùn)行時(shí)(runtime),它提供了大量用JS與操作系統(tǒng)打交道的API,通過(guò)這些API,我們可以調(diào)用本地程序、讀寫(xiě)磁盤、監(jiān)聽(tīng)端口、發(fā)起網(wǎng)絡(luò)請(qǐng)求等,這足以開(kāi)發(fā)出一個(gè)功能完善的Server。

前期準(zhǔn)備

簡(jiǎn)單介紹完Node.js,開(kāi)始寫(xiě)代碼之前,我們需要安裝Node.js,安裝詳細(xì)過(guò)程就不說(shuō)明了,請(qǐng)大家Google或者百度。不同系統(tǒng)安裝過(guò)程不一樣,如果是Linux、Mac,會(huì)相對(duì)順利且遇到問(wèn)題的可能性較低。

判斷安裝成功與否,windows下,在cmd中執(zhí)行node -v,Linux、Mac下,在shell中執(zhí)行node -v,正常輸出版本號(hào)說(shuō)明安裝成功。

tips:

windows如果提示命令未找到,可能是未配置環(huán)境變量

實(shí)現(xiàn)簡(jiǎn)單的Server

Node.js安裝成功,我們找個(gè)地方新建目錄my-server作為我們的存放代碼的地方,接下來(lái)所有的代碼都在該目錄下。首先,在my-server的目錄下新建文件index.js,用如下代碼實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Server:

// index.js
// 通過(guò)require獲取兩個(gè)node內(nèi)置模塊
const http = require('http');
const nUrl = require('url');
// '127.0.0.1'表明只有本機(jī)可訪問(wèn),'0.0.0.0'表示所有人可訪問(wèn)
const hostname = '127.0.0.1';
const port = 3000;
// 通過(guò)http.createServer獲取一個(gè)server實(shí)例
// 其中(req, res) => {},在服務(wù)器每次接收到請(qǐng)求時(shí)都會(huì)被執(zhí)行
const server = http.createServer((req, res) => {
  let method = req.method; // 客戶端請(qǐng)求方法
  let url = nUrl.parse(req.url); // 將請(qǐng)求url字符串轉(zhuǎn)換為node的url對(duì)象
  // 如果客戶端GET請(qǐng)求'/',會(huì)執(zhí)行這個(gè)分支里面的邏輯
  if (method === 'GET' && url.pathname === '/') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello World');
    return;
  }
  // 如果客戶端GET請(qǐng)求'/api/user',會(huì)執(zhí)行這個(gè)分支里面的邏輯
  if (method === 'GET' && url.pathname === '/api/user') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify({
      code: 0,
      msg: '',
      result: {
        username: 'shasharoman'
      }
    }));
    return;
  }
  // 沒(méi)有匹配其他分支的話,執(zhí)行以下邏輯
  res.statusCode = 404;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Not Found');
});
// server開(kāi)始監(jiān)聽(tīng),等待請(qǐng)求到來(lái)
server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

文件內(nèi)容編輯保存后,在my-server目錄下通過(guò)命令node index.js啟動(dòng)服務(wù),然后在瀏覽器中訪問(wèn)http://127.0.0.1:300/、http://127.0.0.1:300/api/user、http://127.0.0.1:300/xxx觀察不同結(jié)果。

這是官方Guides經(jīng)過(guò)小小修改得到的代碼,添加部分注釋以及額外邏輯。主要為了更清晰傳達(dá)以下幾個(gè)知識(shí)點(diǎn):

  • 從req對(duì)象上獲取method與url,這個(gè)req對(duì)象是客戶端請(qǐng)求的“抽象表現(xiàn)”,平時(shí)寫(xiě)Ajax指定的絕大部分內(nèi)容都可以從該對(duì)象上獲取
  • 中間添加的兩個(gè)if分支,主要是為了讓大家了解服務(wù)器如何區(qū)分不同請(qǐng)求,決定做不同事情,即路由概念
  • Content-Type: application/json,通常API會(huì)使用的響應(yīng)格式,表明返回?cái)?shù)據(jù)是json格式,這是一個(gè)HTTP頭部,屬于HTTP協(xié)議相關(guān)知識(shí)
  • statusCode:404,HTTP最常見(jiàn)的錯(cuò)誤“Not Found”,也屬于HTTP協(xié)議相關(guān)知識(shí)

往前優(yōu)化一步

通過(guò)上面的代碼,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單Server,但真實(shí)場(chǎng)景下我們會(huì)這樣去實(shí)現(xiàn)嗎?答案是肯定不會(huì),所以我們還需要一步步完善,做以下幾個(gè)修改:

  • 增加config,在其中配置hostname,port
  • 增加controller,用于分層以及分模塊
  • 增加route,用于定義路由

代碼不多,一共五個(gè)文件:

  • config.js,配置文件
  • route.js,路由定義文件
  • controller/account.js,賬號(hào)模塊業(yè)務(wù)實(shí)現(xiàn)文件
  • controller/index.js,業(yè)務(wù)匯總并暴露給外部
  • index.js,項(xiàng)目啟動(dòng)文件
// config.js
exports = module.exports = {
  hostname: '127.0.0.1',
  port: '3000'
};
// route.js
exports = module.exports = [{
  method: 'GET',
  path: '/api/user',
  impl: 'account.userById'
}, {
  method: 'POST',
  path: '/api/user',
  impl: 'account.createUser'
}];
// controller/account.js
exports.userById = userById;
exports.createUser = createUser;
function userById(req, res) {
  res.end('waiting for impl.');
}
function createUser(req, res) {
  res.end('waiting for impl.');
}
// controller/index.js
exports.account = require('./account');
// index.js
const http = require('http');
const nUrl = require('url');
const config = require('./config');
const controller = require('./controller');
const route = require('./route').map(item => {
  console.log(`route ${item.method}:${item.path}`);
  let tuple = item.impl.split('.');
  item.impl = controller[tuple[0]][tuple[1]];
  return item;
});
const server = http.createServer((req, res) => {
  let method = req.method;
  let url = nUrl.parse(req.url);
  let matchRoute = route.find(item => {
    return item.method === method && item.path === url.pathname;
  });
  if (matchRoute) {
    matchRoute.impl(req, res);
    return;
  }
  res.statusCode = 404;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Not Found');
});
server.listen(config.port, config.hostname, () => {
  console.log(`Server running at http://${config.hostname}:${config.port}/`);
});

依舊是用node index.js啟動(dòng)Server,如果要在現(xiàn)有模式下開(kāi)發(fā)一個(gè)API,主要就兩步:

  • 在route.js中定義路由
  • 在controller/中實(shí)現(xiàn)

做這個(gè)程度的優(yōu)化,只是為了向大家傳達(dá)一些比較寬泛的概念,還不是真正用來(lái)寫(xiě)API服務(wù),只是為了大伙練練手。

這個(gè)程度還達(dá)不到真實(shí)場(chǎng)景需求,還需要經(jīng)過(guò)幾輪改造,包括模塊、層、common、lib、query解析,body解析、更靈活的route等一系列事情,限于篇幅,有機(jī)會(huì)在一一講述。

經(jīng)過(guò)我的描述以及代碼示例,如果大家有興趣學(xué)習(xí)Node.js,建議多搜搜相關(guān)知識(shí),保持關(guān)注,然后在逐步去熟悉Node.js流行的Web框架如:Express、Koa等,不過(guò)框架只是更高層面的封裝,基礎(chǔ)的概念以及知識(shí)還是需要花時(shí)間才能掌握。

如果前端想嘗試后端編程,請(qǐng)一定先學(xué)習(xí)HTTP協(xié)議,推薦《HTTP權(quán)威指南》從頭到尾認(rèn)真看一遍。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • 使用node.js中的Buffer類處理二進(jìn)制數(shù)據(jù)的方法

    使用node.js中的Buffer類處理二進(jìn)制數(shù)據(jù)的方法

    大家應(yīng)該都知道在客戶端JavaScript腳本代碼中,對(duì)二進(jìn)制數(shù)據(jù)并沒(méi)有提供一個(gè)很好的支持。然而,在處理TCP流或文件流時(shí),必須要處理二進(jìn)制數(shù)據(jù)。因此,下面通過(guò)這篇文章來(lái)一起看看利用node.js中的Buffer類處理二進(jìn)制數(shù)據(jù)的方法,有需要的朋友們可以參考借鑒。
    2016-11-11
  • node.js到底要不要加分號(hào)淺析

    node.js到底要不要加分號(hào)淺析

    這篇文章主要給大家介紹了關(guān)于node.js到底要不要加分號(hào)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Nodejs+angularjs結(jié)合multiparty實(shí)現(xiàn)多圖片上傳的示例代碼

    Nodejs+angularjs結(jié)合multiparty實(shí)現(xiàn)多圖片上傳的示例代碼

    這篇文章主要介紹了Nodejs+angularjs結(jié)合multiparty實(shí)現(xiàn)多圖片上傳的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 手動(dòng)下載Chrome并解決puppeteer無(wú)法使用問(wèn)題

    手動(dòng)下載Chrome并解決puppeteer無(wú)法使用問(wèn)題

    本篇文章主要介紹了手動(dòng)下載Chrome并解決puppeteer無(wú)法使用問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • 用node擼一個(gè)監(jiān)測(cè)復(fù)聯(lián)4開(kāi)售短信提醒的實(shí)現(xiàn)代碼

    用node擼一個(gè)監(jiān)測(cè)復(fù)聯(lián)4開(kāi)售短信提醒的實(shí)現(xiàn)代碼

    這篇文章主要介紹了用node擼一個(gè)監(jiān)測(cè)復(fù)聯(lián)4開(kāi)售短信提醒的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • express文件上傳中間件Multer詳解

    express文件上傳中間件Multer詳解

    multer是express官方推薦的文件上傳中間件,它是在busboy的基礎(chǔ)上開(kāi)發(fā)的。目前multer的最新版本為:~1.1.0。本文將詳細(xì)介紹express文件上傳中間件Multer的安裝與使用等,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-10-10
  • 利用node.js如何創(chuàng)建子進(jìn)程詳解

    利用node.js如何創(chuàng)建子進(jìn)程詳解

    之前看多進(jìn)程這一章節(jié)時(shí)發(fā)現(xiàn)這塊東西挺多,寫(xiě)Process模塊的時(shí)候也有提到,今天下午午休醒來(lái)靜下心來(lái)好好的看了一遍,發(fā)現(xiàn)也不是太難理解。所以下面這篇文章主要給大家介紹了關(guān)于利用node.js如何創(chuàng)建子進(jìn)程的相關(guān)資料,需要的朋友可以參考下。
    2017-12-12
  • 如何在Node和瀏覽器控制臺(tái)中打印彩色文字

    如何在Node和瀏覽器控制臺(tái)中打印彩色文字

    這篇文章主要介紹了如何在Node和瀏覽器控制臺(tái)中打印彩色文字,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • nodeJs實(shí)現(xiàn)基于連接池連接mysql的方法示例

    nodeJs實(shí)現(xiàn)基于連接池連接mysql的方法示例

    這篇文章主要介紹了nodeJs實(shí)現(xiàn)基于連接池連接mysql的方法,結(jié)合具體實(shí)例形式分析了nodejs連接池操作mysql數(shù)據(jù)庫(kù)連接的實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2018-02-02
  • Node.js+jade抓取博客所有文章生成靜態(tài)html文件的實(shí)例

    Node.js+jade抓取博客所有文章生成靜態(tài)html文件的實(shí)例

    下面小編就為大家?guī)?lái)一篇Node.js+jade抓取博客所有文章生成靜態(tài)html文件的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09

最新評(píng)論

呼图壁县| 湖口县| 莎车县| 新民市| 筠连县| 湛江市| 响水县| 井冈山市| 太白县| 曲阜市| 晋州市| 定州市| 扎兰屯市| 井冈山市| 台山市| 巴东县| 中山市| 夹江县| 年辖:市辖区| 巧家县| 会宁县| 红安县| 枣庄市| 昌图县| 基隆市| 邳州市| 合作市| 浦县| 巨野县| 怀化市| 盖州市| 两当县| 桐梓县| 亳州市| 顺义区| 遵义市| 哈尔滨市| 营口市| 涟源市| 东城区| 溆浦县|