前面介绍过node的简单实例,但在实际应用中,可以直接使用框架来处理http请求,如express。下面我们使用express来搭建一个web应用,并连接MySQL数据库。
一、安装相关工具
npm install express sequelize sequelize-cli mysql2 -S
二、数据库的初始化
1、新建数据库
2、使用sequelize cli初始化项目的数据库配置信息
npx sequelize init
3、初始化数据库配置信息后,在自动生成的config.json文件中,配置数据库信息
"development": {
"username": "root",
"password": "root",
"database": "node", //在这里配置刚刚新建的数据库名称
"host": "127.0.0.1",
"dialect": "mysql",
"timezone" "+08:00"
}
4、生成模型文件
npx sequelize model:generate --name Todo --attributes name:string,deadline:date,content:string,status:int
5、持久化模型对应的数据库表
npx sequelize db:migrate
6、刷新新建的数据库,可以看到刚刚创建的todo数据表
三、目录结构
config、migrations、models、seeders是安装sequelize后自动生成的文件。
四、ORM模型的使用——api实现
const express = require('express');
const app = express();
const models = require('../models');
const bodyParser = require('body-parser');
/*
express提供的内置中间件有三种:static,json,urlencoded
*/
app.use(express.json());
app.use(express.urlencoded());
app.use(express.static('static',{
extensions:['html','htm'] //请求静态资源时,若没有后缀,增加默认后缀
}))
app.use(bodyParser.urlencoded({extended:true}));
// 获取任务列表
app.get('/list',async (req,res,next)=>{
try{
// 查询并且汇总数
let {status,page,limit} = req.query;
let offset = limit*(page-1);
let where = {};
if(status>0){
where.status = status
}
let list = await models.Todo.findAndCountAll({
where,
offset,
limit: +limit
})
res.json({
list
})
}catch(err){
next(err);
}
})
// 创建任务
app.post('/create',async (req,res,next)=>{
try{
let {name,deadline,content} = req.body;
let todo = await models.Todo.create({
name,
deadline,
content
})
res.json({
message:'创建任务成功',
todo
})
}catch(err){
next(err);
}
})
// 修改任务
app.post('/update',async (req,res,next)=>{
try{
let {name,deadline,content,id} = req.body;
let todo = await models.Todo.findOne({
where:{
id
}
})
if(todo){
todo = await todo.update({
name,
deadline,
content
})
}
res.json({
message:'修改成功',
todo
})
}catch(err){
next(err);
}
})
// 修改任务状态
app.post('/status',async (req,res,next)=>{
try{
let {status,id} = req.body;
let todo = await models.Todo.findOne({
where:{
id
}
})
if(todo){
todo = await todo.update({
status
})
}
res.json({
message:'修改成功',
todo
})
}catch(err){
next(err);
}
})
// 404处理中间件,对express来说,404不是error
function handleNotFoundMidWare(req,res,next){
res.json({
message:'api不存在'
})
}
// 自定义一个处理异常的中间件
function handleErrMidWare(err,req,res,next){
if(err){
let {message} = err;
res.status(500).json({
message
})
}
}
// 404和异常处理的中间件放到最后面
app.use(handleNotFoundMidWare);
app.use(handleErrMidWare);
app.listen(8888,()=>{
console.log('server启动成功');
})
五、完整项目链接