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

首頁 > 編程 > JavaScript > 正文

零基礎之Node.js搭建API服務器的詳解

2019-11-19 12:01:09
字體:
來源:轉載
供稿:網友

零基礎之Node.js搭建API服務器

這篇文章寫給那些Node.js零基礎,但希望自己動手實現服務器API的前端開發者,嘗試幫大家打開一扇門。

HTTP服務器實現原理

HTTP服務器之所以能提供前端使用的API,其實現原理是服務器保持監聽計算機的某個端口(通常是80),等待客戶端請求,當請求到達并經過一系列處理后,服務器發送響應數據給到前端。

平時大家通過Ajax調用API,即是發起一次請求,經過服務器處理后,得到結果,然后再進行前端處理。如今使用高級編程語言,要實現服務器那部分功能已經變得非常簡單,接下來我們了解一下使用Node.js如何實現。

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

Node.js是一個JavaScript的運行時(runtime),它提供了大量用JS與操作系統打交道的API,通過這些API,我們可以調用本地程序、讀寫磁盤、監聽端口、發起網絡請求等,這足以開發出一個功能完善的Server。

前期準備

簡單介紹完Node.js,開始寫代碼之前,我們需要安裝Node.js,安裝詳細過程就不說明了,請大家Google或者百度。不同系統安裝過程不一樣,如果是Linux、Mac,會相對順利且遇到問題的可能性較低。

判斷安裝成功與否,windows下,在cmd中執行node -v,Linux、Mac下,在shell中執行node -v,正常輸出版本號說明安裝成功。

tips:

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

實現簡單的Server

Node.js安裝成功,我們找個地方新建目錄my-server作為我們的存放代碼的地方,接下來所有的代碼都在該目錄下。首先,在my-server的目錄下新建文件index.js,用如下代碼實現一個簡單的Server:

// index.js// 通過require獲取兩個node內置模塊const http = require('http');const nUrl = require('url');// '127.0.0.1'表明只有本機可訪問,'0.0.0.0'表示所有人可訪問const hostname = '127.0.0.1';const port = 3000;// 通過http.createServer獲取一個server實例// 其中(req, res) => {},在服務器每次接收到請求時都會被執行const server = http.createServer((req, res) => {  let method = req.method; // 客戶端請求方法  let url = nUrl.parse(req.url); // 將請求url字符串轉換為node的url對象  // 如果客戶端GET請求'/',會執行這個分支里面的邏輯  if (method === 'GET' && url.pathname === '/') {    res.statusCode = 200;    res.setHeader('Content-Type', 'text/plain');    res.end('Hello World');    return;  }  // 如果客戶端GET請求'/api/user',會執行這個分支里面的邏輯  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;  }  // 沒有匹配其他分支的話,執行以下邏輯  res.statusCode = 404;  res.setHeader('Content-Type', 'text/plain');  res.end('Not Found');});// server開始監聽,等待請求到來server.listen(port, hostname, () => {  console.log(`Server running at http://${hostname}:${port}/`);});

文件內容編輯保存后,在my-server目錄下通過命令node index.js啟動服務,然后在瀏覽器中訪問http://127.0.0.1:300/http://127.0.0.1:300/api/userhttp://127.0.0.1:300/xxx觀察不同結果。

這是官方Guides經過小小修改得到的代碼,添加部分注釋以及額外邏輯。主要為了更清晰傳達以下幾個知識點:

  • 從req對象上獲取method與url,這個req對象是客戶端請求的“抽象表現”,平時寫Ajax指定的絕大部分內容都可以從該對象上獲取
  • 中間添加的兩個if分支,主要是為了讓大家了解服務器如何區分不同請求,決定做不同事情,即路由概念
  • Content-Type: application/json,通常API會使用的響應格式,表明返回數據是json格式,這是一個HTTP頭部,屬于HTTP協議相關知識
  • statusCode:404,HTTP最常見的錯誤“Not Found”,也屬于HTTP協議相關知識

往前優化一步

通過上面的代碼,實現了一個簡單Server,但真實場景下我們會這樣去實現嗎?答案是肯定不會,所以我們還需要一步步完善,做以下幾個修改:

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

代碼不多,一共五個文件:

  • config.js,配置文件
  • route.js,路由定義文件
  • controller/account.js,賬號模塊業務實現文件
  • controller/index.js,業務匯總并暴露給外部
  • index.js,項目啟動文件
// config.jsexports = module.exports = {  hostname: '127.0.0.1',  port: '3000'};
// route.jsexports = module.exports = [{  method: 'GET',  path: '/api/user',  impl: 'account.userById'}, {  method: 'POST',  path: '/api/user',  impl: 'account.createUser'}];
// controller/account.jsexports.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.jsexports.account = require('./account');
// index.jsconst 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啟動Server,如果要在現有模式下開發一個API,主要就兩步:

  • 在route.js中定義路由
  • 在controller/中實現

做這個程度的優化,只是為了向大家傳達一些比較寬泛的概念,還不是真正用來寫API服務,只是為了大伙練練手。

這個程度還達不到真實場景需求,還需要經過幾輪改造,包括模塊、層、common、lib、query解析,body解析、更靈活的route等一系列事情,限于篇幅,有機會在一一講述。

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

如果前端想嘗試后端編程,請一定先學習HTTP協議,推薦《HTTP權威指南》從頭到尾認真看一遍。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。如果你想了解更多相關內容請查看下面相關鏈接

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江城| 弥渡县| 民乐县| 黔西县| 顺昌县| 淮南市| 平谷区| 乃东县| 任丘市| 望江县| 宜城市| 石渠县| 荆门市| 突泉县| 吴忠市| 西充县| 福清市| 友谊县| 清新县| 汾阳市| 桐梓县| 邳州市| 天柱县| 旬邑县| 邯郸县| 福建省| 翁牛特旗| 正蓝旗| 育儿| 阿巴嘎旗| 福海县| 七台河市| 新宾| 泰州市| 建平县| 沙湾县| 成安县| 治多县| 寻甸| 增城市| 溆浦县|