亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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/user、http://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權威指南》從頭到尾認真看一遍。

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩有码视频在线| 精品久久久免费| 欧美激情网站在线观看| 久久香蕉国产线看观看网| 国产免费一区二区三区在线观看| 国产精品成人久久久久| 亚洲精品美女在线观看| 国产精品夜色7777狼人| 欧美大片免费观看在线观看网站推荐| 国产日韩精品入口| 国产日韩欧美日韩大片| 色悠悠久久88| 97国产精品视频| 日韩电影大片中文字幕| 日韩精品在线私人| 九九热在线精品视频| 国产精品第3页| 日韩精品一二三四区| 1769国内精品视频在线播放| 国产精品v片在线观看不卡| 国产97在线|亚洲| 久久精品在线播放| 国产精品偷伦一区二区| 日韩视频精品在线| 日韩在线观看免费高清完整版| 欧美另类极品videosbestfree| 影音先锋欧美精品| 亚洲色图15p| 欧美精品久久久久久久| 日韩精品极品视频| 日韩精品中文字幕在线播放| 成人黄色大片在线免费观看| 北条麻妃99精品青青久久| 国产欧美在线看| 亚洲久久久久久久久久| 亚洲欧美日韩在线高清直播| 91国产精品视频在线| 亚洲免费影视第一页| 成人网在线免费观看| 91亚洲精品视频| 欧美视频在线免费看| 国产一区二区成人| 日本欧美中文字幕| 亚洲国产精品电影在线观看| 国产欧美精品一区二区| 欧美黑人性生活视频| 成人午夜在线影院| 茄子视频成人在线| 色青青草原桃花久久综合| 超碰91人人草人人干| 成人精品视频在线| 日韩电影在线观看永久视频免费网站| 精品激情国产视频| 伊人久久久久久久久久久久久| 亚洲欧美综合精品久久成人| 91老司机精品视频| 欧美在线一区二区三区四| 亚洲男女自偷自拍图片另类| 亚洲成人动漫在线播放| 欧美成人激情视频免费观看| 亚洲电影成人av99爱色| 97香蕉久久夜色精品国产| 国产精品专区h在线观看| 亚洲在线第一页| 国产欧美va欧美va香蕉在| 欧美激情aaaa| 亚洲色图偷窥自拍| 777午夜精品福利在线观看| 国产在线拍偷自揄拍精品| 亚洲人成啪啪网站| 日韩精品中文字| 久久综合国产精品台湾中文娱乐网| 久久91超碰青草是什么| 欧美国产日韩精品| 热久久这里只有| 国产精品欧美一区二区| 国产精品视频xxxx| 欧美另类极品videosbest最新版本| 中文字幕亚洲无线码a| 日韩欧美国产网站| 亚洲欧美日韩精品久久亚洲区| 欧美午夜影院在线视频| 亚洲精品一区在线观看香蕉| 国产亚洲精品一区二555| 亚洲成年人在线播放| 中国china体内裑精亚洲片| 97精品国产97久久久久久| 久久五月情影视| 中文字幕免费国产精品| 欧美与欧洲交xxxx免费观看| 国产精品久久久久久久av大片| 欧美性xxxxhd| 国产精品v片在线观看不卡| 国内精品模特av私拍在线观看| 91麻豆国产语对白在线观看| 日本精品视频在线观看| 亚洲国产精品视频在线观看| 国产精品99久久久久久久久久久久| 国产美女扒开尿口久久久| 国产欧美在线观看| 夜夜嗨av一区二区三区免费区| 91av福利视频| 国产中文字幕亚洲| 1769国产精品| 亚洲一区二区三区在线视频| 国外成人在线视频| 亚洲国产精品久久精品怡红院| 国产视频久久久久| 久久久噜久噜久久综合| 茄子视频成人在线| 欧美在线一区二区视频| 国产视频久久久久| 成人在线视频福利| 中文字幕精品久久久久| 精品久久香蕉国产线看观看亚洲| 中文字幕一区二区三区电影| 欧美老妇交乱视频| 97色在线观看| 亚洲成人性视频| 欧美成人中文字幕在线| 日本精品久久久久久久| 久久中国妇女中文字幕| 亚洲国产精品一区二区三区| 日韩福利伦理影院免费| 中文日韩电影网站| 韩国美女主播一区| 日韩大胆人体377p| 91免费看视频.| 亚洲欧美国产视频| 国产精品观看在线亚洲人成网| 日韩成人av网址| 亚洲视频视频在线| 欧美激情videos| 高清亚洲成在人网站天堂| 日韩电影中文字幕一区| 欧美午夜精品久久久久久久| 日韩高清电影免费观看完整版| 亚洲欧美在线第一页| 91精品国产91久久久久久不卡| 国产欧美日韩免费看aⅴ视频| 精品久久久久久久久久| 欧美日韩中文字幕在线视频| 国产欧美在线观看| 欧美激情videoshd| 国产精品av在线播放| 日韩欧美aⅴ综合网站发布| 91免费福利视频| 欧美大片在线看| 日韩av一区二区在线| 91精品在线观看视频| 国产一区二区三区在线免费观看| 精品久久久久久中文字幕大豆网| 国产成人亚洲精品| www.亚洲免费视频| 欧美第一黄网免费网站| 九九九久久久久久| 91老司机在线| 久久天天躁日日躁| 亚洲毛片在线免费观看| 久久福利视频网| 欧美一区深夜视频| 欧美日韩一区二区在线播放| 精品亚洲一区二区三区在线观看| 国内精品小视频|