Node- express+mysql实践

2,843 阅读3分钟

本文记录了使用nodejs的express框架+mysql如何写一些接口

❗准备工作

1.生成Express应用

express -e

上面命令在当前文件夹创建了一个 Express 应用。并且设置为使用 ejs 模板引擎

你会看到这样一个目录:

.
├── app.js
├── bin
│   └── www
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js
│   └── users.js
└── views
    ├── error.ejs
    ├── index.ejs
    └── layout.ejs

2.运行Express应用

执行如下两个命令

yarn install or npm insatll //下载依赖包
yarn start or npm start  //启动应用

这个时候打开浏览器地址栏输入localhost:3000你已经可以看见一个express应用了

3.在项目增加一些东西变得更符合我们的需求

下面调整后的项目目录结构,后面会说的新增文件里都写了什么

.
├── app.js
├── bin
│   └── www
+├── common #项目公用文件,sql配置文件以及一些公用方法。
+│   ├── config.js #数据库配置文件
+│   ├── sql.js #连接数据库
+│   └── utils.js #公用方法
+├── controllers #控制层,连接数据模型与路由层
+│   ├── user.js #用户相关控制层
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes # 路由
│   ├── index.js 
│   └── users.js #用户相关路由
└── views #ejs模板
    ├── error.ejs
    +├── fail.ejs #请求失败的模板
    +├── success.ejs #请求成功的模板
    ├── index.ejs
    └── layout.ejs

4.common代码片段

  • config.js
module.exports = {
  host: "localhost",
  user: "root", // 数据库用户名
  password: "root", // 数据库密码
  database: "nodejs" // 数据库名
}
  • sql.js
const mysql = require('mysql');   //引入了新的npm第三方包,在此之前先执行npm install mysql or yarn add mysql

const configObj = require('./config')

const db = mysql.createConnection({
  ...configObj
})

db.connect((err) => {
  if (err) {
    console.log('数据库连接失败:' + err.message);
    return;
  };
  console.log('数据库连接成功!')
})
global.db = db; //使用node全局变量,在appjs中引入后app作用域都可访问,用于操作数据库
  • utils.js
// node中使用回调的api大部分都是异步的,这里对操作数据库动作做下封装。
async function RunSQL(sql) {
  return new Promise((resolve, reject) => {
    db.query(sql, (err, result) => {
      if (err) reject(err);
      resolve(result)
    })
  })
}

global.RunSQL = RunSQL;

5.controllers代码片段

  • user.js
/**
 * 注册用户
 * */
const signup = (req, res, next) => {
  const { username, password } = req.body;
  const userNameIsOnlySql = `SELECT * FROM node_user WHERE user_name = '${username}'`;
  const insertUserNameSql = `INSERT INTO node_user (user_name) VALUES ('${username}')`;

  // 执行插入前执行查一下该用户名是否被注册
  RunSQL(userNameIsOnlySql).then((queryRepeatUserList) => {
    // 无结果证明没有被注册
    if (!queryRepeatUserList.length) {
      db.query(insertUserNameSql, function (err, sqlResult) {
        if (err) {
          console.error('[注册用户失败[error]:', err.message);
          res.render('fail', { message: err.message })
          return;
        }
        res.render('success', { data: JSON.stringify({ user_id: sqlResult.insertId }), message: '用户注册成功' })
      });
    } else {
      res.render('fail', { message: '用户名重复' });
    }
  }).catch((err) => res.render('fail', { message: err.message }))
}


exports.signup = signup;

6.ejs模板代码片段

  • success.ejs
{
"code":"E0",
"message":"<%-message?message:'请求成功'%> ",
"data":<%-data%>
}
  • fail.ejs
{
"code":"E400",
"message":"<%-message%> ",
"data":"[]"
}

7.router代码片段

  • users.js
var express = require('express');
var router = express.Router();
var userCtl = require('../controllers/user'); //user控制层

/* 注册用户 */
router.post('/regiup', userCtl.signup);

module.exports = router;

8.app.js代码片段

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cors = require('cors');  //这个包用来处理跨域,上面没说到
var cookieParser = require('cookie-parser');
var logger = require('morgan');


var app = express();

// 配置全局变量 app.js作用域下所有文件都可以访问common中的db和RunSQL
require(process.cwd() + '/common/sql.js');
require(process.cwd() + '/common/utils.js');

// router
var usersRouter = require('./routes/users');

app.use(express.urlencoded()); 
// cors 默认配置就是下面这几项,完全可以写成app.use(cors());
app.use(cors({
  "origin": "*",
  "credentials": true,
  "methods": "GET,POST,PUT,PATCH,DELETE"
}))

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/api/users', usersRouter);


module.exports = app;

9.运行项目

执行

npm stert or yarn start

控制台打印数据库连接成功,项目成功启动,现在可以在我们的前端调一下/api/users/regiup接口啦~

  • 第一次调 Snipaste_2021-05-09_23-12-19.png
  • 第二次调 Snipaste_2021-05-09_23-13-17.png
  • 如上,我连续注册了两次用户名一样的人,只有第一次是成功的,第二次注册失败了,这是对的,现在看看数据库中有没有insert吧

Snipaste_2021-05-09_23-18-52.png

  • 插入正常,大功告成!

10.结语

  • 当然,如果想在实际工作中用的话,还是需要细化很多东西的,这里只记录了一个简易版的。
  • 不足的地方欢迎欢迎大佬指点一二,小弟不胜感激。