vue2+nodejs+express+mysql+pm2搭建全栈项目

前言:

    本项目github地址:https://github.com/kaiqiangren/VueExpress

    由于是自己尝试搭建的一个简单的nodejs+vue全栈项目,适用于初探nodejs后端领域的前端er。

    本文的mysql部分需要参考另一篇文章: Express+Vue+mysql实践

    进程守护及负载均衡相关可查看:https://blog.csdn.net/qq_24182885/article/details/81975438

    注:mysql版本为5.7,最新版本的mysql 8.0+会与此项目有冲突。解决办法可看 

   MAC的mysql下载链接:https://pan.baidu.com/s/1r_gAPAXs9GpJ5g2DrAGg7A 密码:qlnh

    https://blog.csdn.net/lr123838/article/details/80505529

    https://blog.csdn.net/DA_learner/article/details/80202190

正文:

    一、安装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'   //可自定义或者使用默认配置 具体参考vue-cli3搭建项目

        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;

服务代码:

附上数据库表结构:

本地数据库名称 test1    

表名称   user_info

表内部字段如下:

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 -i max   //启动本地后端服务器(多集群模式)

       npm run dev  //启动本地前端项目

        pm2 start webServer.js  //打包后,启动nodejs前端静态资源服务器(像nginx一样将dist文件夹作为静态资源使用)

        pm2 list  //查看当前运行的进程

        pm2 stop all //停止所有进程运行

        pm2 stop <App name> //单独停止1个进程

        pm2 delete all  //删除pm2 list中缓存的所有项目 

        pm2 delete <id> //根据id删除pm2 list中缓存的单独项目

   

8、部署上线(1台web服务器,1台nodejs服务器)

Nginx配置可以参考 : https://blog.csdn.net/qq_29480353/article/details/80048391

        (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 -i max(pm2启动配置文件)  //启动nodejs服务

                执行pm2 start webServer.js(你的前端服务器文件) //启动web服务器

    9、总结

        由于是第一次写这类文章,记录下自己对nodejs的探索之路,并针对探索之路,不断更新该文章,还请大家多多支持!

        


版权声明:本文为qq_24182885原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。