Express 搭建服務器

簡介

Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js’ package ecosystem, npm, is the largest ecosystem of open source libraries in the world.

試用場景

  1. 適宜I/O密集型運用
  2. 適宜前端開闢者疾速搭建服務器,平經常使用於前後端星散

裝置Nodejs

  1. windows

    • 翻開node官網https://nodejs.org
    • 直接點擊 LTS 版本,下載裝置包,Current版本是開闢版,不要下載,如圖
      《Express 搭建服務器》
    • 下載完成以後,直接裝置即可
  2. ubuntu

    • 運轉以下敕令

      curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
      sudo apt-get install -y nodejs
  3. mac

    • 與windows相似,下載裝置包即可
      《Express 搭建服務器》

裝置完成后,運轉以下敕令搜檢是不是裝置勝利,(以上要領裝置node都邑帶上對應的npm,所以也須要搜檢一下npm是不是裝置勝利。)

node -v // 搜檢node版本
npm -v  // 搜檢npm版本

搭建服務器

  1. 裝置express

Express is a minimal and flexible Node.js web application framework that provides a robust set of features for web and mobile applications.

npm install express -g            // 全局裝置express
npm install express-generator -g  // 全局裝置express腳手架,裝置以後能夠運用express敕令
express --version                 // 搜檢express版本
  1. 天生項目文件
mkdir app
cd app
/**
 * 天生項目文件
 * express 默許運用ajs模板,加上 -e 指定更友愛的ejs模板
 */
express -e
npm intall    // 裝置依靠
npm start     // 啟動項目

然後瀏覽器接見localhost:3000,最簡樸的服務器就ok了。

Express 進階

  1. 怎樣修正順序啟動的默許3000端口
    Express 的啟動目次是<project>/bin/www,內里有一行代碼:

    var port = normalizePort(process.env.PORT || '3000');

    不難看出順序先去取process.env.PORT(環境變量PORT)的值,沒有就默許為3000
    所以假如想轉變端口,能夠直接把3000改成想要的端口號或許修正環境變量PORT的值,操縱以下:
    在啟動順序之前,實行

    // ubuntu IOS
    export PORT=4000;
    // windows
    set PORT=4000;

    然後實行npm start,端口就被設置成了4000.

  2. 怎樣修正運轉環境
    Express默許的運轉環境是development,運轉環境能夠經由過程process.env.NODE_ENV來獵取,將體系環境設置為production,代碼以下:

    // ubuntu IOS
    export NODE_ENV=production
    // wondows
    set NODE_ENV=production
  3. 怎樣增加接口
    app.js中,app.use('/', routes);前面新增

    app.get('/status', function (req, res) {
        res.send({status: 'ok'});
    })

    啟動服務器,接見localhost:3000/status,獲得數據{status: 'ok'};
    具體分析一下:
    app.get(), get是app對象的一個要領,負責處置懲罰get要領,改成post,則只處置懲罰post要求,不會處置懲罰別的要求,其他像put,delete相似。若寫成use,則會處置懲罰此路由任何要領的要求。
    /status, 指定須要處置懲罰的路由
    回調函數,即要求此路由的處置懲罰函數,它能夠吸收兩個參數,三個參數,四個參數。一旦參數為四個就被express認定是毛病處置懲罰函數

    // app.js 里這就是個毛病處置懲罰函數,用來處置懲罰一切路由上面拋出的毛病,平常寫在末了
    app.use(function(err, req, res, next) {
     res.status(err.status || 500);
     res.render('error', {
       message: err.message,
       error: err
     });
    });

    req
    Express 封裝的http request對象,包括headers,query,params等自帶屬性。用來獵取某次http要求的各項數據。
    res
    Express 封裝的http reponse對象,包括send,json,jsonp等要領。
    next
    假如實行next,在實行完此處置懲罰函數以後,會繼承向後找下一個處置懲罰函數,

    app.get('/test-next', function(req, res, next) {
        console.log('first handler fn');
        next();
    });
    app.get('/test-next', function(req, res, next) {
        res.send({status: 'second handler fn'});
    });

    瀏覽器接見localhoat:3000/test-next,會獲得{status: 'second handler fn'},
    處置懲罰路由/test-next,第一個回調函數,實行到next()時,繼承找下一個能處置懲罰/test-next的回調.

  4. 什麼是中心件
    中心件(middlewear)是Express中的一個主要觀點,Express運用中心件完成對要求體的革新,或許實行一些中心操縱。歸根結柢,中心件就是一個函數,滿足兩個前提,

    1. req,res,next三個參數,
    2. 末了實行next函數,將處置懲罰權移交出去

      寫一個打印要求的中心件:

      // 定義中心件,打印要求的要領和url
      function logRequest(req, res, next) {
          console.log(req.method, method.url);
          next();
      }
      // 運用中心件
      app.use(logRequest);
    1. Express 怎樣處置懲罰路由
      關於一個要求,Express處置懲罰經由一下流程

      1. 從第一個use最先處置懲罰要求,假如是中心件,處置懲罰完成以後,繼承向下處置懲罰
      2. 假如碰到指定靜態文件的中心件,會查詢靜態文件是不是婚配,假如婚配直接返回,不婚配就繼承向下尋覓適宜路由。
      3. 假如婚配到自定義的路由,馬上實行回調函數,假如處置懲罰函數中沒有next()則不再往下實行,假如實行了next(),會繼承向下婚配。
      4. 假如一個也沒有婚配到,會進入404處置懲罰中心件,這个中心件會拋出一個毛病,交由毛病處置懲罰中心件處置懲罰。
    2. 明白靜態資本處置懲罰中心件
      app.use(express.static(path.join(__dirname, 'public')));,express.static(PATH) 會將指定的目次下的一切資本作為靜態資本。客戶端能夠輸入指定資本的途徑接見此資本。實在能夠明白為將靜態資本的途徑,作為路由註冊到了app
      假如要將文件<project>/public/stylesheets/style.css,設置為靜態資本,能夠指定靜態文件目次

      app.use(express.static(path.join(__dirname, 'public')));

      也能夠不設置靜態文件,自定義路由

      app.get('/stylesheets/style.css', function (req, res, next) {
          res.sendFile(path.join(__dirname, 'public/stylesheets/style.css'));
      })

      兩種體式格局接見http://localhost:3000/stylesheets/style.css都能獲得style.css文件。
      靜態資本和用戶自定義路由是等價的,所以,平常將靜態資本處置懲罰中心件放在用戶自定義中心件前面,防止路由爭執。

    3. 怎樣運用模板(默許運用ejs模板引擎)

      // path 為.ejs模板的途徑
      // data 是給模板傳入的值,必需是對象範例
      res.render(<path>, [data]);

      比方
      app.js

      app.get('/ejs', function(req, res, next) {
          res.render('index', { title: 'Express' });
      });

      index.ejs

      <h1><%= title %></h1>
      <p>test ejs</p>

      接見localhost:3000/ejs即可看到效果。
      ejs的經常使用語法以下

      1. <% %> 在標籤里能夠寫恣意的 javascript 代碼,能夠把 javascript 代碼拆開或許合在一同寫,也能夠與 html 標籤一同寫:

        <% var a = 1
           var b = 2 
           var c = a+b %>
         // var user = [1,2,3]
         <% for(let i=0; i<user.length; i++) { %>
            <p> html </p>
         <% } %>
      2. <%= %> 輸出轉義后的內容

         // ejs
         <p><%= '<lol>' %></p>
        
         // 轉義后
         <p>&lt;lol&gt;</p>
      3. <%- %> 輸出未轉義的內容

        // ejs
        <p><%- '<a href="http://www.baidu.com>baidu</a>' %></p>
        
        // 不轉義的輸出
        <p><a href="http://www.baidu.com>baidu</a></p> 
      4. <%# %> 解釋
      5. include 引入其他 ejs 文件,比方援用當前 ejs 文件同級目次下有一個名為 test.ejs 的文件,代碼以下:

        // exp1
        <% var data = 1 %>
        <% include ./test %>
        // exp2
        <%- include('test', {data:1}) %>
    原文作者:SPACE
    原文地址: https://segmentfault.com/a/1190000015170332
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞