Node.js 研究

瀏覽器中的js VS NodeJs中的js

)

瀏覽器中的js,就是ECMAScript語法+Web API。html

NodeJs中的js,就是ECMAScript語法+Node API。前端

上圖能夠看到,語法都是相同的語法(ECMAScript),只不過所在的環境不一樣,提供的API不一樣,能幹的事就不同了。圖沒有列出全部的API,但能夠看出,在NodeJS環境中提供的http(http服務相關)。就可讓NodeJs寫出服務端程序了。node

前端開發 VS 後端開發

前端開發思惟 VS 後端開發思惟

正如上面所說的,編程語言對於咱們學習NodeJs不是障礙,就是ES語法。mysql

首要轉換咱們的思惟,前端是請求數據,而後處理請求結果。後端是接受請求,而後響應請求返回數據。nginx

先後端注重的點,是不同的,前端注重呈現和交互。後端注重安全和穩定。git

前端技術棧 VS 後端技術棧

學習NodeJs是一項大工程,是要學習一整套技術,掌握後端的技術棧,才能真正在工做中使用。redis

我畫一個大概的先後端技術棧對比圖:sql

後端有些技術,是前端用不到的,好比數據庫sql。也有些技術,是先後端公共的,好比cookie這種,後端還會注意set-cookie、和session相關的知識點。數據庫

相信經過上圖,咱們能瞭解NodeJs是什麼級別的技術了,不是單指某項技術,而是指Js進行後端開發。express

NodeJs知識梳理

啓動服務

從整體上觀察NodeJs後,再看看細節,第一步就是啓動服務:

var http = require("http");

http.createServer(function(request, response) {
  // 處理一切
  // request接收請求
  // response響應請求
}).listen(8888);

複製代碼

NodeJs最主要的也就是這段代碼了,服務端就是在接收/響應請求。NodeJs用了一個回調方法,我就能夠在其中處理一切了。

路由

要處理不一樣的請求就寫switch就好了。

http.createServer(function(request, response) {
  // 從request中獲取請求url和method:get/post
  switch(url){
    case '/api/blog/list':
        // 返回博客列表相關代碼
        break;
    case '/api/blog/new':
        // 新建博客相關代碼
        break;
    ...
    case '/api/user/list':
        // 返回用戶列表相關代碼
        break;
    case '/api/user/new':
        // 新建用戶相關代碼
        break;
    ...
  }
}).listen(8888);
複製代碼

一個項目裏,要在一個方法裏寫全部處理請求的代碼,不合理,要拆分啊。就有了路由。

咱們將不一樣的請求處理,放到不一樣的文件裏,以blog/user這樣的業務邏輯爲分割:

// app.js
http.createServer(function(req, res) {
 handleBlogRouter(req, res)
 handleUserRouter(req, res)
}).listen(8888);
複製代碼
// router/blog.js
export default handleBlogRouter(req, res){
    ...
    switch(url){
    case '/api/blog/list':
        // 返回博客列表相關代碼
        break;
    case '/api/blog/new':
        // 新建博客相關代碼
        break;
    ...
  }
}
複製代碼
// router/user.js
export default handleBlogRouter(req, res){
    ...
    switch(url){
    case '/api/user/list':
        // 返回用戶列表相關代碼
        break;
    case '/api/user/new':
        // 新建用戶相關代碼
        break;
    ...
  }
}
複製代碼

後端的路由,和前端的路由,概念上仍是有區別的,前端指頁面跳轉,一個頁面一個路由。後端一個接口地址,指一個路由。

controler

咱們繼續拆分,讓router也單一職責,將業務邏輯也抽離出來:

// router/blog.js
const {
    getBlogList,
    newBlog,
    ...
} = require('../controler/blog')

export default handleBlogRouter(req, res){
    ...
    switch(url){
    case '/api/blog/list':
        const result = getBlogList(id);
        res.json(result);
        break;
    case '/api/blog/new':
        const result = newBlog(body);
        res.json(result);
        break;
    ...
  }
}
複製代碼

這裏將生成json、或者生成html等返回數據放在router裏,可是業務邏輯,放在controler裏。

項目結構

下面基本列一下項目結構,在咱們不使用任何框架的狀況下,也須要拆分代碼。

└─bin #啓動HTTP服務
    │   www.js      
├─logs #日誌文件
└─src  #項目源碼
    |   controler #放controler,業務邏輯
    |   model  #放model,數據模型,數據庫操做
    |   router #路由相關
    |   utils #工具類文件
    |   db #數據庫相關 mysql,redis等基本服務封裝
    |   config #項目相關配置
├─app.js 主文件,啓動文件
複製代碼

展現項目結構源碼地址

我按這個基本的項目結構,寫了個小項目,已上傳到碼雲。點擊這裏查看

在項目中,還能夠看到我對請求的主要處理,加強請求對象,包含獲取 path 解析、 query解析、cookie設置、session封裝、post請求封裝。 設置響應對象,如設置返回格式爲 JSON。

數據庫

首先要選擇一個數據庫,我選擇的是mysql。熟悉數據庫工具,使用sql語句。

  1. 安裝數據庫,安裝數據庫可視化客戶端
  2. nodejs鏈接數據庫,將代碼寫到db文件夾中,接着在model文件夾中寫sql語句,接着controler裏在調用model中封裝的方法。

cookie、session、redis

這三個知識點是有關聯的。都是有關狀態存儲的。

http是無狀態的,要想記錄狀態,就須要用cookie。服務端要記錄更多安全的信息,就須要session。更好的利用服務端內存,增長穩定性,就須要redis內存數據庫。

最典型的應用就是登陸狀態的記錄。利用cookie記錄一個key,利用session存儲用戶的敏感信息,也可將session存入redis中。

文件操做

服務端須要文件操做,當遇到大文件的時候,還需使用Stream流操做。

最典型的應用的地方,就是日誌操做。

安全

服務端必不可少的一塊內容就是安全方面的內容,放置xss攻擊,sql注入攻擊等。

express

理解了服務端開發的方方面面後,就能夠上手一個框架了express目前應用的挺廣的。

var express = require('express');
var app = express();

app.get('/', function (req, res) {
    res.send('Hello World!');
});

app.listen(3000, function () {
    console.log('Example app listening on port 3000!');
});
複製代碼

可使用express-generator這樣的腳手架,生成的項目,路由日誌等模塊,都集成好了。

npm install -g express-generator
複製代碼

中間件的使用

框架的核心機制就是插件機制。一個請求過來的時候,一個插件處理一下,交給下一個插件,處理完再交給下一個,逐個處理,最後由負責業務的插件返回響應結果。

這樣就將職責拆分開來。讓每一個插件指處理單一的任務。而且是遞進的,如上一個插件封裝的操做cookie的相關方法,那下一個插件就能夠在request對象中拿到對應的方法,處理業務。

koa2

瞭解過express後,再看Koa也容易上手了。區別於exress,一個是增長了異步,一個是插件機制變成了洋蔥模型。

app.use(async (ctx, next) => {
    await next();
    var data = await doReadFile();
    ctx.response.type = 'text/plain';
    ctx.response.body = data;
});
複製代碼

插件的核心機制仍是沒有變的,也作到了對於一個請求的處理各個職責上的拆分。

koa2也有相應的腳手架

npm install -g koa-generator
複製代碼

nginx反向代理

因爲咱們的服務器上,即部署了前端也部署了後端,就須要一個反向代理來分配,那些是請求前端資源,哪些是請求後端資源了。

結束語

我只是node的入門階段,這篇也只是對NodeJs開發的總體作一個大概的介紹。想學好nodeJs,還需多多實戰,掌握後端開發的一些概念和技術。在實踐中理解它的工做機制及原理。

相關文章
相關標籤/搜索