位置: IT常识 - 正文

复习 - node.js(接口案例)(nodejs基础知识)

编辑:rootadmin
其实复习一次的作用真实太大了,真的,自从上次ajax开始其实就开始i有点懵懵懂懂的感觉,一直拖想到了node在去回顾一遍,这一次回去复习,ajax已经很熟练了,node之前搞不懂那些原理也顺清楚了好多,其实这次复习没有什么需要说的知识点,因为要说的前面都说过了,我来说一下这个做的一个大项目吧,这个项 ...

推荐整理分享复习 - node.js(接口案例)(nodejs基础知识),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:node.js基础知识,复习方法,复习资料,复习方法,node.js基础知识,node.js知识点,node.js知识点,复习计划,内容如对您有帮助,希望把文章链接给更多的朋友!

其实复习一次的作用真实太大了,真的,自从上次ajax开始其实就开始i有点懵懵懂懂的感觉,一直拖想到了node在去回顾一遍,这一次回去复习,ajax已经很熟练了,node之前搞不懂那些原理也顺清楚了好多,其实这次复习没有什么需要说的知识点,因为要说的前面都说过了,我来说一下这个做的一个大项目吧,这个项目真的,应该是我不熟练的愿意那边,就是用express写接口,用postman来测试,三个模块,三个数据库,基本上都在我的代码里面了,写的很详细步骤,用到的技术,基本上是用node的express模块,去写接口,然后中途中到了一些中间件,比如规定语义规则的joi,比如给密码解码加密的bcryptjs,我做了一天才做下来这一个案例

一个项目初试化,首先要创立一个单独的项目文件夹,然后终端npm init直接安装package.json,api.js接口文件,路由模块创立一个文件夹夹,路由函数又要分为一个模块,再把数据库创立好,基本就可以开始完成功能需求了,用后端node完成增删改查

项目文件分类:

1

接口文件

// 1.初始化// 1.1创建项目const express = require('express')const app = express()// 1.2配置跨域const cors = require('cors')app.use(cors())// 1.3配置解析表单中间件// 错误点:记住要有参数app.use(express.urlencoded({extended : false}))// 2.3因为后面处理函数用到了很多res.send所以封装为一个全局中间件,给res绑定一个函数,那后面的中间件路由都可以用到这个函数了app.use((req, res, next) => { res.cc = function(err, status = 1) { res.send({ status, msg : err instanceof Error ? err.message : err }) } next()})// 2.4.6配置解析token的中间件const expressJWT = require('express-jwt')const secretKey = require('./secretKey')app.use(expressJWT({secret : secretKey.secretKey, algorithms : ['HS256']}).unless({path : [/^\/api\//]}))// 1.4.4导入路由模块const routerUser = require('./router/user')const Joi = require('joi')const { expressjwt } = require('express-jwt')const { path } = require('express/lib/application')app.use('/api', routerUser)// 3.1.1个人中心路由导入const infoRouter = require('./router/userinfo')app.use('/my', infoRouter)// 4.1.2文章管理导入const article = require('./router/acticle')app.use('/my/article', article)// 5.1.2发布文章路由导入const cates = require('./router/cate')app.use('/my/article', cates)// 2.2.3定义规则joi的错误级别中间件app.use((err, req, res, next) => { if (err instanceof Joi.ValidationError) return res.send(err.message) // 2.4.7增加jwt错误中间件 if (err.name == 'UnauthorizedError') return res.cc('身份认证失败') return res.send('其他错误')})app.listen(80, () => { console.log('http://127.0.0.1');})

2.

写好接口文件该去给路由创建模块

// 1.4初始化路由相关文件夹 不光要给路由分装一个模块 里面的处理函数也要有一个模块const express = require('express')const { append } = require('express/lib/response')const router = express.Router()// 1.4.2导入路由处理函数const routerHandler = require('../router_handler/user')// 注册// 2.2.2导入joi验证输入进来的是否合法const expressJOI = require('@escook/express-joi')const {schema_user_info} = require('../schema/user')router.post('/reguser',expressJOI(schema_user_info), routerHandler.getReguser)// 2.4登录// 2.4.1添加语法规则,可以直接用注册的router.post('/login',expressJOI(schema_user_info), routerHandler.getLogin)module.exports = router

3.

处理函数模块

// 1.4.1初始化路由处理函数模块//注册const db = require('../mysql')//导入密码加密解密包const bcrypt = require('bcryptjs')function getReguser(req, res) { // res.send('这里是注册模块') // 2.2.4检测用户名是否被占用 导入mysql let selectUser = 'select * from users where username = ?' db.query(selectUser, req.body.username, (err, results) => { // 2.3.1用到我们前面定义的全局中间件优化res.send if (err) return res.cc(err) if (results.length == 1) return res.cc('用户名已被占用') // 2.2.5如果过了前两关的验证 基本可以验证成功了 就先对密码进行加密处理安装bcryptjs req.body.password = bcrypt.hashSync(req.body.password, 10) // console.log(req.body.password); // 2.2.6插入新用户 let insertUser = 'insert into users set ?' // -------------注意一下这里插入数据库的参数怎么写的 db.query(insertUser, [{username : req.body.username, password : req.body.password}], (err, results) => { if (err) return res.cc(err) if (results.affectedRows !== 1) return res.cc('注册失败') res.cc('注册成功',0) }) })}//登录// 2.4.4.1导入jwtconst jwt = require('jsonwebtoken')const secretKey = require('../secretKey')const { result } = require('@hapi/joi/lib/base')function getLogin(req, res) { // res.send('这里是登录模块') // 2.4.2根据用户名查询用户的数据 let selectLoginuser = 'select * from users where username = ?' db.query(selectLoginuser, req.body.username, (err, results) => { if (err) res.cc(err) if (results.length !== 1) res.cc('未找到该用户') // 2.4.3有数据就去判断密码是否正确 // console.log(results); if (!bcrypt.compareSync(req.body.password, results[0].password)) return res.cc('密码错误') // 2.4.4用户名有,密码 也对上了说明登陆成功,开始jwt身份认证 // 先剔除密码和头像的值 let user = {...results[0], password : '', user_pic: '',algorithms : ['HS256']} let userToken = jwt.sign(user, secretKey.secretKey, {expiresIn : '1h'}) // 2.4.5向客户端发送token res.send({ status : 0, msg : '登录成功', token : 'Bearer ' + userToken }) })}// 获取用户基本信息function getInfo(req,res) { // res.send('个人中心') // 3.1.2获取用户基本信息 let selectInfo = 'select id,username,nickname,email,user_pic from users where id = ?' db.query(selectInfo, req.user.id, (err, results) => { if (err) return res.cc(err) if (results.length !== 1) return res.cc('获取信息失败') res.send({ status : 0, msg : '获取信息成功', data : results[0] }) })}// 3.2更新用户信息function updateInfo(req, res) { // res.send('更新用户信息') // 3.2.4更新用户功能 let updateInfo = 'update users set ? where id = ?' db.query(updateInfo, [req.body, req.user.id], (err, results) => { if (err) return res.cc(err) if (results.affectedRows !== 1) return res.cc('更新信息失败') res.cc('更新信息成功', 0) })}// 3.3重置密码function updatePwd(req, res) { // res.send('重置密码') // 3.3.2查询用户是否存在 let selectExist = 'select * from users where id = ?' db.query(selectExist, req.user.id, (err, results) => { if (err) return res.cc(err) if (results.length !== 1) return res.cc('用户不存在') // 3.3.3前面那一步虽然无所谓但这一步必须的 判断输入的旧密码是否正确 if(!bcrypt.compareSync(req.body.oldPwd, results[0].password)) return res.cc('输入密码错误') // 3.3.4对新密码加密后更新到数据库 let password = bcrypt.hashSync(req.body.newPwd) let updatePwd = 'update users set password =? where id =?' db.query(updatePwd, [password,req.user.id], (err, results) => { if (err) return res.cc(err) if (results.affectedRows !== 1) return res.cc('修改密码失败') res.cc('更新密码成功', 0) }) })}// 3.4更换头像function updateAvatar(req, res) { // res.send('更换头像') // 3.4.3 let updateAvatar = 'update users set user_pic = ? where id = ?' db.query(updateAvatar, [req.body.avatar, req.user.id], (err, results) => { if (err) return res.cc(err) if (results.affectedRows !== 1) return res.cc('更新头像失败') res.cc('更新头像成功', 0) })}module.exports = { getLogin, getReguser, getInfo, updateInfo, updatePwd, updateAvatar}

4.

复习 - node.js(接口案例)(nodejs基础知识)

这个时候就可以去api入口文件测试一下了,然后在数据库写好我们的数据表,创立一个js文件链接数据库

// 2.登录注册// 2.1建好数据库后配置数据库const { result } = require('@hapi/joi/lib/base')const mysql = require('mysql')const db = mysql.createPool({ host : '127.0.0.1', user : 'root', password : 'admin123', database : 'mydb'})// 测试/* db.query('select 1' , (err, results) => { if(err) return console.log(err.message); return console.log(results);}) */module.exports = db

5.

没记错的话,在登录接口应该使用jwt认证机制生成token吧

const express = require('express')const router = express.Router()const routerHandler = require('../router_handler/user')// 3.个人中心// 3.1获取用户基本信息router.get('/userinfo', routerHandler.getInfo)// 3.2.1更新用户信息// 3.2.3添加验证规则const expressJoi = require('@escook/express-joi')const {schema_update_info, schema_update_avatar} = require('../schema/user')router.post('/userinfo',expressJoi(schema_update_info),routerHandler.updateInfo)// 3.3.1重置密码const {schema_update_pwd} = require('../schema/user')router.post('/updatepwd',expressJoi(schema_update_pwd), routerHandler.updatePwd)// 3.4.1更换头像const {schema_updatee_avatar} = require('../schema/user')router.post('/update/avatar',expressJoi(schema_updatee_avatar), routerHandler.updateAvatar)module.exports = router

token的验证规则

module.exports = { secretKey : 'sdfafsfds'}

上面就是整个user部分的接口了包括登录注册,添加删除修改账号或者密码等,下面是我们的user的验证规则

// 2.2注册// 2.2.1对表单数据验证,这里就不if else了直接用上joi来验证 joi要下最新版而且直接导入joiconst { number } = require('joi')const joi = require('joi')const username = joi.string().alphanum().min(1).max(10).required()// 错误点:正则{}里面的量词之间不能以空格隔开const password = joi.string().pattern(/^[\S]{6,12}$/).required()// 3.2.2更新用户信息规则const id = joi.number().integer().min(1).required()const nickname = joi.string().required()const email = joi.string().email().required()// 3.4.2更换头像规则const avatar = joi.string().dataUri().required()module.exports.schema_user_info = { body : { username, password }}module.exports.schema_update_info = { body : { id, nickname, email }}module.exports.schema_update_pwd = { // 3.3.2重置密码规则 body : { oldPwd : password, // --------------错误点这里就算是变量也要添加引号 newPwd : joi.not(joi.ref('oldPwd')).concat(password) }}module.exports.schema_updatee_avatar = { body : { avatar }}

6.

这个部分是对文章的名字和别名的增删改查的操作了,这里面的难点在于要去理解那个怎么来判断是否重名哪里

// 4.1.1文章分类列表函数const { result } = require('@hapi/joi/lib/base')const db = require('../mysql')function getArticleList(req, res) { // res.send('文章分类列表') // 4.1.3获取文章数据 let selectArticleList = 'select * from article where is_delete = 0' db.query(selectArticleList, (err, results) => { if (err) return res.cc(err) res.send({ status : 0, msg : '获取文章分类列表成功', data : results }) })}// 4.2.1新增文章分类function addCates(req,res) { // 4.2.3名字与别名是否重名 let selectDuplicate = 'select * from article where name = ? or alias = ?' db.query(selectDuplicate, [req.body.name, req.body.alias], (err, results) => { if(err) return res.cc(err) if(results.length == 2) return res.cc('文章名字和别名已被占用') if(results.length == 1 && results[0].name == req.body.name && results[0].alias == req.body.alias) return res.cc('文章名字和别名已被占用') if(results.length == 1 && results[0].name == req.body.name) return res.cc('文章名字被占用') if(results.length == 1 && results[0].alias == req.body.alias) return res.cc('文章别名被占用') // 4.2.4实现文章分类新增 let addArt = 'insert into article set ?' db.query(addArt, req.body, (err, results) => { if(err) return res.cc(err) if (results.affectedRows !== 1) return res.cc('新增文章失败') res.cc('新增文章分类成功', 0) }) })}// 4.3.1根据idshanchuwenzhanfunction deleteCate(req, res) { // 4.3.3实现删除功能 let deleteId = 'update article set is_delete = 1 where id = ?' db.query(deleteId, req.params.id, (err, results) => { if (err) return res.cc(err) if (results.affectedRows !== 1) return res.cc('删除文章失败') res.cc('删除文章分类成功', 0) })}// 4.4.1根据id获取文章分类function requireArt(req,res) { // 4.4.2 let selectArt = 'select * from article where id = ?' db.query(selectArt, req.params.id, (err, results) => { if (err) return res.cc(err) if (results.length !== 1 || results[0].is_delete == 1) return res.cc('没有该文章') res.send({ status : 0, msg : '获取文章分类数据成功', data : results[0] }) })}// 4.5.1根据id更新文章function updateArt(req, res) { // 4.5.2查看是否重名 // -----------------这里需要先将自己这一项排除出来 let selectIdDuplicate = 'select * from article where id != ? and (name = ? or alias = ?)' db.query(selectIdDuplicate, [req.body.id, req.body.name, req.body.alias], (err, results) => { if (err) return res.cc(err) if (results.length == 2) return res.cc('文章名称和别名已被占用') if (results.length == 1 && results[0].name == req.body.name && results[0].alias == req.body.alias) return res.cc('文章名称和别名已被占用') if (results.length == 1 && results[0].name == req.body.name) return res.cc('文章名称已被占用') if (results.length == 1 && results[0].alias == req.body.alias) return res.cc('别名已被占用') let updateIdArt = 'update article set ? where id = ?' db.query(updateIdArt, [req.body, req.body.id] , (err,results) => { if (err) return res.cc(err) if (results.affectedRows !== 1) return res.cc('文章更新失败') res.cc('更新分类信息成功', 0) }) })}module.exports = { getArticleList, addCates, deleteCate, requireArt, updateArt}

这是路由模块,上面是路由的处理函数

// 4.文章类别管理const express = require('express')const router = express.Router()const routerhanlder = require('../router_handler/article')// 4.1获取文章分类列表router.get('/cates',routerhanlder.getArticleList)// 4.2新增文章分类const expressJoi = require('@escook/express-joi')const {add_article_list, update_id_cate} =require('../schema/article')router.post('/addcates',expressJoi(add_article_list),routerhanlder.addCates)// 4.3根据id删除文章const {delete_id_cate} = require('../schema/article')router.get('/deletecate/:id',expressJoi(delete_id_cate),routerhanlder.deleteCate)// 4.4根据id获取文章分类数据router.get('/cates/:id',expressJoi(delete_id_cate), routerhanlder.requireArt)// 4.5根据id更新文章分类数据const {update_id_Art} = require('../schema/article')router.post('/updatecate',expressJoi(update_id_Art) ,routerhanlder.updateArt)module.exports = router

然后我们的规则

const joi = require('joi')// 4.2.2新增文章规则const name = joi.string().required()const alias = joi.string().alphanum().required()// 4.3.2根据id删除文章 注意这个id是动态的而且是get请求,所以不再是body数据const id = joi.number().integer().min(1).required()module.exports.add_article_list = { body : { name, alias }}module.exports.delete_id_cate = { params : { id }}module.exports.update_id_Art = { body : { id : id, name : name, alias : alias }}

7.

最后是我们的添加文章这个功能,就是往每一个刚才创建好的文章里面,添加新文章,直接看逻辑的实现吧

// 5.1.1发布文章函数const path = require('path')const db = require('../mysql')function addCate(req, res) { // 5.1.5因为上传表单无法用joi所以要单独规定 if (!req.file || req.file.fieldname !== 'cover_img') return res.cc('请上传图片') // 5.1.6事先发布文章功能 const cateObj = { ...req.body, cover_img : path.join('/uploads', req.file.filename), pub_date : new Date(), author_id : req.user.id } let addInsert = 'insert into articles set ?' db.query(addInsert, cateObj, (err, results) => { if (err) return res.cc(err) if (results.affectedRows !== 1) return res.cc('发布文章失败') res.cc('发布文章成功', 0) })}module.exports = { addCate}// 1.4初始化路由相关文件夹 不光要给路由分装一个模块 里面的处理函数也要有一个模块const express = require('express')const { append } = require('express/lib/response')const router = express.Router()// 1.4.2导入路由处理函数const routerHandler = require('../router_handler/user')

// 注册// 2.2.2导入joi验证输入进来的是否合法const expressJOI = require('@escook/express-joi')const {schema_user_info} = require('../schema/user')router.post('/reguser',expressJOI(schema_user_info), routerHandler.getReguser)

// 2.4登录// 2.4.1添加语法规则,可以直接用注册的router.post('/login',expressJOI(schema_user_info), routerHandler.getLogin)

module.exports = router

本文链接地址:https://www.jiuchutong.com/zhishi/303329.html 转载请保留说明!

上一篇:命名空间在php中的使用(命名空间 php)

下一篇:如何使用(扫描)二维码进行登录(如何使用扫描王)

  • ipad平板怎么找不到个人热点(ipad怎么找到)

    ipad平板怎么找不到个人热点(ipad怎么找到)

  • iqoo8pro怎么开启智能接听(iQOO8Pro怎么开启root权限)

    iqoo8pro怎么开启智能接听(iQOO8Pro怎么开启root权限)

  • 华为p40有3.5mm耳机孔吗(华为p40pro有3.5mm耳机孔吗)

    华为p40有3.5mm耳机孔吗(华为p40pro有3.5mm耳机孔吗)

  • 华为mate30pro音量键不灵敏怎么回事(华为mate30pro音量怎么调)

    华为mate30pro音量键不灵敏怎么回事(华为mate30pro音量怎么调)

  • 华为解除管控后打不开(华为解除管控后打不开软件)

    华为解除管控后打不开(华为解除管控后打不开软件)

  • 两个系统怎么选择启动(两个系统怎么选一个系统)

    两个系统怎么选择启动(两个系统怎么选一个系统)

  • 微信可不可以隐藏好友(微信可不可以隐藏群聊)

    微信可不可以隐藏好友(微信可不可以隐藏群聊)

  • 模拟录像机能用网络摄像头吗(模拟录像机能用网口添加一个数字信号吗)

    模拟录像机能用网络摄像头吗(模拟录像机能用网口添加一个数字信号吗)

  • 自己怎么退出微信群(自己怎么退出微信账号)

    自己怎么退出微信群(自己怎么退出微信账号)

  • 快手推广曝光什么意思(快手号推广曝光度不高)

    快手推广曝光什么意思(快手号推广曝光度不高)

  • powerbi和excel区别(powerbi和powerquery)

    powerbi和excel区别(powerbi和powerquery)

  • sata2接口能用sata3硬盘吗(sata接口可以用sata3吗)

    sata2接口能用sata3硬盘吗(sata接口可以用sata3吗)

  • 2mbps是多少网速(472mbps是多少网速)

    2mbps是多少网速(472mbps是多少网速)

  • iphone11深色模式有什么用(iphone11深色模式和浅色模式哪个省电)

    iphone11深色模式有什么用(iphone11深色模式和浅色模式哪个省电)

  • 文字间隔怎么设置(怎样设置文字间隔)

    文字间隔怎么设置(怎样设置文字间隔)

  • 手机浏览器广告怎么关闭(手机浏览器广告拦截)

    手机浏览器广告怎么关闭(手机浏览器广告拦截)

  • 华为手机怎么设置自动关机(华为手机怎么设置24小时制时间)

    华为手机怎么设置自动关机(华为手机怎么设置24小时制时间)

  • 米聊怎么随机加好友(米聊怎么添加好友)

    米聊怎么随机加好友(米聊怎么添加好友)

  • 苹果xsmax怎么指纹解锁(苹果xs max如何设置指纹识别)

    苹果xsmax怎么指纹解锁(苹果xs max如何设置指纹识别)

  • 限制群搜索是封群吗(限制群搜索是封号吗)

    限制群搜索是封群吗(限制群搜索是封号吗)

  • dlna怎么连接电视投屏(dlna怎么连接电视传文件)

    dlna怎么连接电视投屏(dlna怎么连接电视传文件)

  • 华为mate20玩游戏微信不提醒(华为mate20玩游戏怎么聊微信)

    华为mate20玩游戏微信不提醒(华为mate20玩游戏怎么聊微信)

  • realmex青春版续航(realmex青春版多长)

    realmex青春版续航(realmex青春版多长)

  • 苹果手机自动订阅怎么现在取消不了了(苹果手机自动订阅)

    苹果手机自动订阅怎么现在取消不了了(苹果手机自动订阅)

  • 新版陌陌阅后即焚在哪(陌陌阅后即焚功能在哪打开)

    新版陌陌阅后即焚在哪(陌陌阅后即焚功能在哪打开)

  • 关于linux(ubuntu 18.04) 中idea操作数据库失败的问题(关于怀孕在线咨询)

    关于linux(ubuntu 18.04) 中idea操作数据库失败的问题(关于怀孕在线咨询)

  • ctbclick.exe是什么进程 会弹出广告吗 作用是什么 ctbclick进程查询(ctblocker)

    ctbclick.exe是什么进程 会弹出广告吗 作用是什么 ctbclick进程查询(ctblocker)

  • 内蒙古注册税务师协会
  • 收到单位借款如何处理
  • 合并报表是把资产负债表相加吗
  • 网上商城的主要功能以及购物流程
  • 环评费用怎么入账
  • 未达起征点销售额和小微企业免税销售额
  • 会计记账凭证如何填制
  • 企业支付宝买东西
  • 押金收不回来没钱怎么办
  • 土地使用权出让金多少钱一平米
  • 个人独资公司需要报税吗
  • 没开发票可以确认收入吗?
  • 小规模发票跨月冲红怎么做账
  • 原材料呆滞物料处理方法
  • 主营业务收入借增贷减
  • 雇主责任险可以税前扣除吗
  • 差额纳税的会计处理
  • 审计风险可控吗
  • 税务局买税控盘需要的资料
  • 汇算清缴补交的税怎么做凭证
  • 废旧物资销售如何征税
  • 本年利润怎么算利润总额
  • 购买粽子开的餐饮发票
  • 社保显示已录入什么意思
  • 企业会计制度怎么备案
  • 企业的其他业务收入有
  • 财务每月需要报哪些税
  • 应收利息的核算范围
  • 自然人税收系统怎么添加人员
  • 小型微利企业在计提所得税时有哪些优惠政策
  • 企业发放贷款怎么做分录
  • 公司注册资金抽逃
  • deepin切换系统
  • 如何去掉电脑桌面背景图
  • win11怎么打开磁盘管理
  • 商品削价要本着既能使企业什么又能使商品扩销的原则
  • 贴现会不会损害所有者权益
  • 取得土地使用权的方式
  • 继续涉入资产后续计量
  • laravel定时任务如何实现的
  • 投资收益会计准则
  • lama羊驼
  • vue3.0路由配置
  • ChatGPT是如何训练得到的?通俗讲解
  • vue.js简介
  • 应收贷方有余额怎么调整
  • 企业接受投资会导致所有者权益增加吗
  • 补提折旧会计处理
  • 国际货运代理公司个人货物
  • 一般纳税人和小规模纳税人怎么界定
  • 政府无偿划转股权印花税
  • 国内旅客运输服务
  • access的数据源在哪里设置
  • 销售商品开票税目
  • 预付款为什么不能抵消工程款
  • 固定资产在以后会计期间可以转回吗
  • 开发成本六大类
  • win8怎么禁止开机启动项
  • Win8.1 VPN设置功能提示连接出错的简单解决方法
  • 2003怎么创建用户
  • ims文件是什么意思
  • win7系统每次开机都要选择用户
  • centos简介
  • 如何删除双系统中的linux系统
  • 升级win10后东西还在吗
  • cocos-2dx
  • png批量转换成jpg
  • nodejs web3
  • glviewport超出屏幕范围
  • 万向节锁到底是什么
  • angular实战
  • bios查看电脑配置信息
  • javascript教程推荐知乎
  • unity ulua
  • js获取节点值
  • android 动态化方案
  • jquery函数大全
  • jquery自定义函数
  • 慰问金使用规定
  • 消费税税目税率表2019
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设