1. 程式人生 > >vue2+nodejs+express+mysql+pm2搭建全棧專案

vue2+nodejs+express+mysql+pm2搭建全棧專案

前言:

    由於是自己嘗試搭建的一個簡單的nodejs+vue全棧專案,適用於初探nodejs後端領域的前端er。

注:mysql版本為5.7,最新版本的mysql 8.0+會與此專案有衝突。解決辦法可看 

正文:

    一、安裝nodejs

        這個步驟請自行搜多百度經驗,進行安裝,當下nodejs已經無需配置環境變數,所以請大家下載下來直接開包即用即可。

    二、初始化前端專案

        1、安裝vue

        npm install vue-cli -g     //這個是將vue腳手架進行全域性安裝。 

        npm install @vue/cli  -g  //vue-cli3腳手架,安裝此腳手架會更改建立專案命令,也可通過橋接npm包來保持vue2的命令

        2、初始化vue專案(進入自己本地的資料夾)

       vue-cli2:  vue init webpack '專案名(任意)'      //等待npm包初始化後,進行下一步

       vue-cli3: vue create 'projectName'   //可自定義或者使用預設配置 具體參考

        npm install pm2 -g     //使用pm2命令,進行負載均衡及程序守護

        3、安裝express、mysql

          npm install express

          npm install mysql

        4、專案結構

            

        5、搭建nodejs伺服器

資料庫連線池部分:

/**
 * Created by renka on 2018/8/10.
 */
const mysql = require("mysql");
//連線上資料庫(連線池)
const pool = mysql.createPool({
  host     : 'localhost',
  user     : 'root',
  password : '123456',
  database:'test'
});
/*封裝資料庫操作方法query--用於增刪改查*/
const query=function(sql,sqlParams,callback){
  pool.getConnection(function(err,conn){
    if(err){
      callback(err,null,null);
    }else{
      conn.query(sql,sqlParams,function(qerr,vals,fields){
        //釋放連線
        conn.release();
        //事件驅動回撥
        callback(qerr,vals,fields);
      });
    }
  });
};
/*模組輸出*/
module.exports=query;

服務程式碼:

const express = require("express");
//定義路由級中介軟體
const router = express.Router();
//引入資料庫連線池,防止資料庫超過最大連線數
const query=require("./db/db");

/*
 * 增刪改查服務路由
 * */
/*新增*/
router.use('/test/add', function (req, res) {
  let sql  ="INSERT INTO user_info (name,country,date,score) VALUES(?,?,?,?);";
  let sqlParams = [
    req.body.name,
    req.body.country,
    req.body.date,
    req.body.score
  ];
  query(sql,sqlParams,function (err,result) {
    if(err){
      res.json({
        ok:false,
        message:'建立失敗!'
      })
    }else{
      res.json({
        ok:true,
        id:result.insertId,
        message:'建立成功!'
      })
    }
    res.end();
  })

});
/*刪除*/
router.use('/test/delete', function (req, res) {
  let delSql = 'DELETE FROM user_info where id='+req.body.id;
  query(delSql,null, function(err, rows, fields) {
    if(err){
      res.json({
        ok:false,
        message:'刪除失敗!',
        error:err
      })
    }else{
      res.json({
        ok:true,
        message:'刪除成功!'
      })
    }
    res.end();
  })
});
/*編輯*/
router.use('/test/edit', function (req, res) {
  let editSql = 'UPDATE user_info SET name=?,country=?,date=?,score=? WHERE id ='+req.body.id;
  let editSqlParams = [
    req.body.name,
    req.body.country,
    req.body.date,
    req.body.score
  ];
  query(editSql,editSqlParams,function (err,result) {
    if(err){
      res.json({
        ok:false,
        message:'修改失敗!'
      })
    }else{
      res.json({
        ok:true,
        message:'修改成功!'
      })
    }
    res.end();
  })
});
/*查詢*/
router.use('/test/query', function (req, res) {
  let pageNumber = req.body.pageNumber;
  let pageSize = req.body.pageSize;
  let start = (pageNumber-1)*pageSize;
  let end = pageNumber*pageSize;
  let sql = "SELECT * FROM user_info ORDER BY score DESC LIMIT "+start+","+end;
  let countSql = "SELECT COUNT(id) FROM user_info";
  const promise = new Promise(function(resolve, reject) {
    query(countSql,null,function (err, rows, fields) {
      resolve(rows);
    })
  }).then((count)=>{
    query(sql, function(err, rows, fields) {
      if(err){
        res.json({
          ok:false,
          message:'查詢失敗!',
          info:null
        })
      }else{
        res.json({
          ok:true,
          message:'查詢成功!',
          info:rows,
          total:count[0]["COUNT(id)"]
        })
      }
      res.end();
    });
  })



});


/*將路由模組輸出*/
module.exports = router;

    6、前端nodejs伺服器

    7、本地除錯

        pm2 start app.js    //啟動本地後端伺服器

        npm run dev  //啟動本地除錯伺服器

        pm2 start webServer.js  //打包後,啟動nodejs前端靜態資源伺服器(像nginx一樣將dist資料夾作為靜態資源使用)

        pm2 list  //檢視當前執行的程序

        pm2 stop all //停止所有程序執行

    8、部署上線(1臺web伺服器,1臺nodejs伺服器)

        (1)Linux系統先安裝nodejs,並配置全域性變數,本地的虛擬機器linux需要解開防火牆,否則無法進行測試

        (2)將相關node_modules模組壓縮,然後解壓至Nodejs伺服器上,使用ftp上傳壓縮包,然後用linux命令進行解壓

      (3)將相關node_modules模組壓縮,然後解壓至web伺服器上,再上傳dist資料夾至web伺服器上,放到node_modules資料夾的同級目錄下。

        (4)使用SecureCRT或者xShell分別連線你的伺服器,進入專案目錄,

                執行pm2 start app.js(你的後端伺服器檔案)  //啟動nodejs服務

                執行pm2 start webServer.js(你的前端伺服器檔案) //啟動web伺服器

     9、nginx對比nodejs

        nginx:

                Nginx支援靜態資源的熱部署,無需重啟伺服器即可完成部署。

        nodejs:

    pm2 start app.js –watch   //根據程式碼變動自動重啟伺服器

    10、總結

        由於是第一次寫這類文章,記錄下自己對nodejs的探索之路,並針對探索之路,不斷更新該文章,還請大家多多支援!