node.jsday08
目录
前言
数据库脚本可以私聊我单独获取,node.js08学习开始
一、复习
二、.错误处理的中间件
- 于是后置的中间件,位置写在所有路由或者路由器的后边
app.use( (err, req, res, next)=>{ err 路由中传递过来的错误信息 res.send({code: 500,msg: '服务器内部错误'}) } )
- 在路由中出现错误后,执行next(err)就可以请求到错误处理中间件
三、接口练习
- 文件目录结构
- 练习1:在routes目录下创建新闻模块路由器news.js,添加路由,最后暴露路由器对象
- 练习2:添加新闻分类的接口(get /menu),查询新闻分类表ht_cat的数据,最后响应{code:200, msg: '新闻分类', data: 数据}
- 练习3:在app.js下引入新闻模块路由器,最后挂载,添加前缀 /v1/news
- 练习4:添加新闻列表的接口(get /list),查询新闻的数据,get传递分类编号cat_id,当前的页码pno,每页的数据量count,执行SQL命令,进行分页查询,查询出这一页的数据,最后响应{ code: 200, msg: '新闻列表', data: 数据, total: 总数据量, pages: 总页码, pno: 当前页码 }
- 练习5:添加新闻详情的接口(get /detail),get传递新闻的编号,查询出编号对应的新闻,如果新闻不存在响应 {code:400,msg:'该文章不存在'},否则响应{code: 200,msg:'新闻详情', data: 数据}
// app.js // 引入express模块 const express = require('express') // 引入关于汉唐路由器 const about = require('./routes/about') // 引入新闻中心路由器 const news = require('./routes/news') // 引入合作交流路由器 const coop = require('./routes/coop') // 引入招贤纳士路由器 const job = require('./routes/job') // 创建WEB服务器 const app = express() // 设置端口 app.listen(3000,()=>{ console.log('服务器启动成功') }) // 将post传参转为对象 app.use( express.urlencoded({ extended: true }) ) // 挂载关于汉唐路由器,添加前缀/v1/about app.use( '/v1/about',about ) // 挂载新闻中心路由器,添加前缀/v1/news app.use( '/v1/news',news ) // 挂载合作交流路由器,添加前缀/v1/coop app.use( '/v1/coop',coop ) // 挂载招贤纳士路由器,添加前缀/v1/job app.use( '/v1/job',job ) // 在所有路由(器)后边,添加错误处理中间件,拦截所有的错误(mysql) app.use( (err,req,res,next)=>{ // err 接收的路由中传递的错误信息 console.log(err) // 响应给客户端错误信息 res.send({code:500,msg:'服务器内部错误'}) } )
// pool.js // 引入mysql模块 const mysql = require('mysql') // 创建连接池对象 const pool = mysql.createPool({ host: '127.0.0.1', port: '3306', user: 'root', password: '', database: 'hantang', connectionLimit: '15', multipleStatements: true }) // 暴露连接池对象 module.exports = pool
// news.js // 引入express模块 const express = require('express') // 引入连接池模块 const pool = require('../pool') // 创建路由器对象 const router = express.Router() // 添加路由 //1.新闻分类接口(get /menu) // 接口地址:/v1/news/menu // 请求方式:get router.get('/menu',(req,res,next)=>{ // 执行SQL命令 pool.query('select * from ht_cat',(err,r)=>{ if(err) { return next(err) } res.send({code:200,msg:'新闻分类',data: r}) }) }) // 2.新闻列表接口(get /list) // 接口地址:/v1/news/list // 请求方式:get router.get('/list',(req,res,next)=>{ // 获取get传递的参数 var obj = req.query // 判断是否为空 if(!obj.pno) { obj.pno = 1 } if(!obj.count){ obj.count = 5 } console.log(obj) // 计算出开始查询的值 var start = (obj.pno-1)*obj.count // 将每页数据量转为数值 var size = parseInt(obj.count) // 执行SQL命令 pool.query('select nid,title,ctime,cat_id from ht_news where cat_id=? limit ?,?; select count(*) n from ht_news where cat_id=?',[obj.cat_id,start,size,obj.cat_id],(err,r)=>{ if(err) { return next(err) } console.log(r) // 响应 res.send({ code: 200, msg: '新闻列表', data: r[0], total: r[1][0].n, //总数据量 pages: Math.ceil(r[1][0].n/obj.count), //总页码 = 向上取整(总数据量/每页数据量) pno: obj.pno }) }) }) // 3.新闻详情接口(get /detail) // 接口地址:/v1/news/detail // 请求方式:get router.get('/detail',(req,res,next)=>{ // 获取get传递的参数 var obj = req.query console.log(obj) // 执行SQL命令 pool.query('select * from ht_news where nid=?',[obj.nid],(err,r)=>{ if(err) { return next(err) } console.log(r) // r 成功结果是数组,如果为空数组说明数据不存在,否则查询成功 if(r.length===0) { res.send({code:400,msg:'该文章不存在'}) }else{ res.send({code:200,msg:'新闻详情',data:r}) } }) }) // 暴露路由器对象 module.exports = router
- 练习6:在路由器目录routes下创建合作交流路由器coop.js,创建路由器对象,添加路由,暴露路由器对象;
- 练习7:在app.js引入路由器coop.js,挂载路由器,添加前缀/v1/coop
练习8:编写提交留言接口(post /add),post传递的参数有姓名,手机号码,邮箱,详情,留言时间,是否为项目推荐,将参数插入到数据表ht_cooperate,最后响应{code:200,msg:'留言成功'}
- 练习9:编写修改留言信息的接口(put /update),post传递留言编号、姓名、手机、邮箱、时间、是否为项目推荐,获取传递的参数,执行SQL命令,修改编号对应的数据,如果修改失败响应{code:400,msg:'修改失败'},否则{code:200,msg:'修改成功'}
- 练习10:编写删除留言信息的接口(delete /message),get传递编号,执行SQL命令,删除编号对应的数据,如果删除失败响应{code:400,msg:'删除失败'},否则删除成功{code:200,msg:'删除成功'}
通过SQL命令的结果判断是否成功
1.插入数据 结果是对象,不需要判断
2.修改数据 结果是对象,判断changedRows属性,如果是0修改失败,否则修改成功
3.删除数据 结果是对象,判断affectedRows属性,如果是0删除失败,否则删除成功
4.查询数据 结果是数组,判断数组长度,如果是空数组查询失败,否则成功
// coop.js // 引入express模块 const express = require('express') // 引入连接池模块 const pool = require('../pool') // 创建路由器对象 const router = express.Router() // 添加路由 // 1.添加留言(post /add) // 接口地址:/v1/coop/add // 请求方式:post router.post('/add',(req,res,next)=>{ // 获取post传递参数 var obj = req.body // 往对象下添加属性 obj.ctime = Date.now() console.log(obj) // 执行SQL命令 pool.query('insert into ht_cooperate set ?',[obj],(err,r)=>{ if(err){ return next(err) } console.log(r) // 直接响应成功,插入不需要判断 res.send({code:200,msg:'留言成功'}) }) }) // 2.修改留言接口(put /update) // 接口地址:/v1/coop/update // 请求方式:put router.put('/update',(req,res,next)=>{ // 获取post传递的参数 var obj = req.body // 添加时间 // obj.ctime = Date.now() console.log(obj) // 执行SQL命令,修改编号对应的数据 pool.query('update ht_cooperate set ? where cid=?',[obj,obj.cid],(err,r)=>{ if(err) { return next(err) } console.log(r) // r 成功的结果是对象,如果对象下的changedRows值为0说明修改失败,否则修改成功 if(r.changedRows === 0){ res.send({code:400,msg:'修改失败'}) }else{ res.send({code:200,msg:'修改成功'}) } }) }) // 3.删除留言接口(delete /message) // 接口地址:/v1/coop/message // 请求方式:delete router.delete('/message',(req,res,next)=>{ // 获取get传递的参数 var obj = req.query console.log(obj) // 执行SQL命令,删除编号对应的留言 pool.query('delete from ht_cooperate where cid=?',[obj.cid],(err,r)=>{ if(err) { return next(err) } console.log(r) // 结果是对象,如果对象下的affectedRows值为0,说明删除失败,否则删除成功 if(r.affectedRows===0){ res.send({code:400,msg:'删除失败'}) }else{ res.send({code:200,msg:'删除成功'}) } }) }) // 暴露路由器对象 module.exports = router
- 练习11:新建job.js路由器, 在app.js下引入并挂载,添加前缀/v1/job
练习12:编写招聘信息的接口(get /list),get传递当前的页码pno和每页数据量count,执行分页查询,查询这一页的数据,最后响应{code:200,msg:'查询成功', data:数据, total: 总数据量, pages: 总页数, pno: 当前页码}
// job.js // 引入express模块 const express = require('express') // 引入连接池模块 const pool = require('../pool') // 创建路由器对象 const router = express.Router() // 添加路由 // 1.列表(get /list) // 接口地址:/v1/job/list // 请求方式:get router.get('/list',(req,res,next)=>{ // 获取get传递的参数 var obj = req.query // 判断参数是否为空 if(!obj.pno) { obj.pno = 1 } if(!obj.count){ obj.count = 2 } // 计算开始查询的值 var start = (obj.pno-1)*obj.count // 将每页数据量转为数值 var size = parseInt(obj.count) // 执行SQL命令(分页,总数据量) pool.query('select * from ht_job limit ?,?;select count(*) n from ht_job',[start,size],(err,r)=>{ if(err) { return next(err) } console.log(r) res.send({ code: 200, msg: '查询成功', data:r[0], total: r[1][0].n, pages: Math.ceil(r[1][0].n/obj.count), pno: obj.pno }) }) }) // 暴露路由器对象 module.exports = router
总结
node.jsday08学习结束