今天小編就爲你們分享一篇關於零基礎之Node.js搭建API服務器的詳解,寫的十分的全面細緻,具備必定的參考價值,對此有須要的朋友能夠參考學習下。若有不足之處,歡迎批評指正。前端
零基礎之Node.js搭建API服務器node
這篇文章寫給那些Node.js零基礎,但但願本身動手實現服務器API的前端開發者,嘗試幫你們打開一扇門。shell
HTTP服務器實現原理編程
HTTP服務器之因此能提供前端使用的API,其實現原理是服務器保持監聽計算機的某個端口(一般是80),等待客戶端請求,當請求到達並通過一系列處理後,服務器發送響應數據給到前端。 平時你們經過Ajax調用API,便是發起一次請求,通過服務器處理後,獲得結果,而後再進行前端處理。現在使用高級編程語言,要實現服務器那部分功能已經變得很是簡單,接下來咱們瞭解一下使用Node.js如何實現。json
什麼是Node.js?它能夠作什麼?windows
Node.js是一個JavaScript的運行時(runtime),它提供了大量用JS與操做系統打交道的API,經過這些API,咱們能夠調用本地程序、讀寫磁盤、監聽端口、發起網絡請求等,這足以開發出一個功能完善的Server。後端
前期準備api
簡單介紹完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'); }); //在此我向你們推薦一個前端全棧開發交流圈:619586920 突破技術瓶頸,提高思惟能力 // server開始監聽,等待請求到來 server.listen(port, hostname, () => { console.log(`Server running at <a href="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通過小小修改獲得的代碼,添加部分註釋以及額外邏輯。主要爲了更清晰傳達如下幾個知識點:
往前優化一步
經過上面的代碼,實現了一個簡單Server,但真實場景下咱們會這樣去實現嗎?答案是確定不會,因此咱們還須要一步步完善,作如下幾個修改:
代碼很少,一共五個文件:
// 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' }]; //在此我向你們推薦一個前端全棧開發交流圈:619586920 突破技術瓶頸,提高思惟能力
// route.js exports = module.exports = [{ method: 'GET', path: '/api/user', impl: 'account.userById' }, { method: 'POST', path: '/api/user', impl: 'account.createUser' }];
// 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 <a href="http://${config.hostname}:${config.port}/`);" rel="external nofollow">http://${config.hostname}:${config.port}/`); </a>}); //在此我向你們推薦一個前端全棧開發交流圈:619586920 突破技術瓶頸,提高思惟能力
依舊是用node index.js啓動Server,若是要在現有模式下開發一個API,主要就兩步: 在route.js中定義路由
在controller/中實現
作這個程度的優化,只是爲了向你們傳達一些比較寬泛的概念,還不是真正用來寫API服務,只是爲了大夥練練手。 這個程度還達不到真實場景需求,還須要通過幾輪改造,包括模塊、層、common、lib、query解析,body解析、更靈活的route等一系列事情,限於篇幅,有機會在一一講述。 通過個人描述以及代碼示例,若是你們有興趣學習Node.js,建議多搜搜相關知識,保持關注,而後在逐步去熟悉Node.js流行的Web框架如:Express、Koa等,不過框架只是更高層面的封裝,基礎的概念以及知識仍是須要花時間才能掌握。 若是前端想嘗試後端編程,請必定先學習HTTP協議,推薦《HTTP權威指南》從頭至尾認真看一遍。
結語
感謝您的觀看,若有不足之處,歡迎批評指正。