本文记录了使用nodejs的express框架+mysql如何写一些接口
❗准备工作
-
已经安装了nodejs
-
已经安装 express项目生成器
-
已经安装了一款mysql客户端工具,我用的是 phpstudy
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
接口啦~
- 第一次调
- 第二次调
- 如上,我连续注册了两次用户名一样的人,只有第一次是成功的,第二次注册失败了,这是对的,现在看看数据库中有没有insert吧
- 插入正常,大功告成!
10.结语
- 当然,如果想在实际工作中用的话,还是需要细化很多东西的,这里只记录了一个简易版的。
- 不足的地方欢迎欢迎大佬指点一二,小弟不胜感激。