Nodejs + Express 搭建 简单的 后台服务

文件结构

在这里插入图片描述

安装

  • Node.js
  • express
    npm install -g express
  • express-generator
    npm install -g express-generator

创建项目

  1. 使用express express-backend创建出一个项目,express-backend为项目名称。
  2. 进入项目文件夹,执行npm install安装相关依赖。
  3. 启动项目npm start,在浏览器输入http://localhost:3000/即可访问了,效果如下:
    在这里插入图片描述

连接数据库MySQL

数据库结构如下:
在这里插入图片描述

  1. 安装MySQL依赖,npm install --save mysql
  2. 在根目录下新建config/index.js文件配置数据库
  allowClient: ["localhost:3000", "127.0.0.1:3000"],
  mysql: {
    host: 'localhost',
    port: '3306',
    user: 'root',
    password: 'root',
    database: 'test',
    multipleStatements: true,
    waitForConnections: true,
    charset: "UTF8MB4_UNICODE_CI"
  },
};
  1. 在根目录下新建utils/db.js文件,
const mysql = require('mysql');
const config = require('../config');
const pool = mysql.createPool(config.mysql);

pool.on('connection', (connection) => {
  // console.log('取得连接');
});

pool.on('release', (connection) => {
  // console.log('释放了连接');
});

pool.on("error", (err) => {
  console.error(err);
});

const getConnection = (res) => {
  return new Promise((resolve, reject) => {
    pool.getConnection((err, connection) => {
      if (err) {
        // not connected!
        console.error(err);
        if (res) {
          res.send( {
            code: "000001",
            msg: "对不起,您还未获得授权",
          });
        }
        reject(err)
      } else {
        resolve(connection)
      }
    });
  });
};

const execQuery = (options, connection, release = true) => {
  return new Promise((resolve, reject) => {
    connection.query(options, function (error, result, field) {
      if (release) {
        // 可以手动选择不 release,复用 connection,在事务结束再 release
        connection.release();
      }

      if (error) {
        // Handle error after the release.
        reject(error)
      } else {
        resolve({
          result,
          field,
        })
      }
    });
  })
};

/**
 * 执行 mysql 查询语句
 * @param {*} options 支持 sql string 和 options 两种形式调用,如果要传参数,必须使用 options 对象,options.sql 是 sql 语句,options.values 是参数数组。
 * @param {*} connection 如果传入 connect 直接使用
 * @param {boolean} release 执行 query 后,是否自动 release
 */
const query = (options, connection, release) => {
  if (connection) {
    return execQuery(options, connection, release)
  } else {
    return getConnection().then(connection => {
      return execQuery(options, connection, release)
    })
  }
};

const execTransaction = (connection, task) => {
  return new Promise((resolve, reject) => {
    connection.beginTransaction(function(err) {
      if (err) {
        reject(err)
      }
      task.then(resp => {
        connection.commit(function(err) {
            if (err) {
              connection.rollback(function() {
                reject(err)
              });
            } else {
              resolve(resp)
            }
        });
      }, err => {
        connection.rollback(function() {
          reject(err)
        });
      }).catch(err => {
        connection.rollback(function() {
            reject(err)
        });
      })
    });
  }).finally(() => {
    connection.release();
  })
};

module.exports.getConnection = getConnection;
module.exports.query = query;
module.exports.execTransaction = execTransaction;
  1. 根目录下新建sql/index.js文件
const user = require('./user.js');
module.exports = {
  ...user,
};
  1. 根目录下新建sql/user.js文件
module.exports = {
  QueryAll: 'SELECT * FROM user',
};
  1. 修改routes/users.js文件
var express = require('express');
var router = express.Router();
const indexSQL = require('../sql');
const dbUtils = require('../utils/db');

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

router.get('/list', (req, res, next) => {
  dbUtils.query({
    sql: indexSQL.QueryAll,
  }).then(({ result }) => {
    if (result) {
      res.send({
        code: '0',
        data: result,
      });
    } else {
      res.send({
        code: '003001',
        data: [],
      });
    }
  });
});

module.exports = router;
  1. 调用接口,结果如下: 在这里插入图片描述
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值