Node — 第八天 (大事件项目接口实现二)

如何处理MySQL的错误

MySQL的错误信息,可以通过err来获取。这是没有问题的。

但是,我们加入了Promise,Promise中的错误,在外部是获取不到的,只能使用Promise相关方法来获取错误信息。

解决方法一

使用 JS原生的 try … catch …

try {let r = await db('insert into user set ?', req.body);res.json({status: 0,message: '注册成功'});
} catch (err) {console.log(err.message); // 输出这个信息,是为了程序员排错res.json({status: 1,message: '注册失败'});
}

解决方法二

使用Promise的catch方法

let r = await db('inssert into user set ?', req.body).catch(err => {console.log(err.message);
});
console.log(r); // 如果有错误,r===undefined。否则r是一个数组或对象
if (r) {res.json({status: 0,message: '注册成功'});
} else {res.json({status: 1,message: '注册失败'});
}

解决方法三

在封装的db中,使用catch方法

/***               db.js  */
....
....
....
// 下面是修改的部分
return new Promise((resolve, reject) => {conn.connect();conn.query(sql, params, (err, result) => {err ? reject(err) : resolve(result);});conn.end();}).catch(err => {console.log(err.message);});

上述做法的可行性分析:

在这里插入图片描述

后续还是直接使用db方法即可。比如注册:

let r = await db('insert into user set ?', req.body);// console.log(r); // 如果有错误,r===undefined。否则r是一个数组或对象
if (r) {res.json({status: 0,message: '注册成功'});
} else {res.json({status: 1,message: '注册失败'});
}

解决登陆账号不能重复的问题

  • 首先,需要把重复的账号删除掉

  • 第二,添加唯一索引
    在这里插入图片描述

添加唯一索引之后,username字段的值不允许重复了。

如果再次添加重复的账号,则会报 Duplicate entry 'admin' for key 'username'

完成登录接口

思路:

执行查询SQL语句,使用账号密码当做条件。如果能够查询到结果,表示账号密码正确。

// 登录的接口
router.post('/login', async (req, res) => {// 假设账号是 admin,密码是 111111// 判断账号密码是否正确。// if (req.body.username === 'admin' && req.body.password === '111111') {let r = await db('select * from user where username=? and password=?', [req.body.username, req.body.password]);// 如果账号密码正确,r是一个非空数组;如果错误,是一个空数组// console.log(r);if (r && r.length > 0) {// 登录成功res.json({status: 0,message: '登录成功',// token: 'Bearer ' + jwt.sign(要保存的信息, 秘钥, 配置项)// 生成的token前面必须有Bearer,还有一个空格。否则一会token不能正常的解密token: 'Bearer ' + jwt.sign({ username: 'hahaha', age: 21 }, 'bigevent-9760', { expiresIn: '1h' })});} else {res.json({status: 1,message: '登录失败'});}// }
});

密码使用md5加密

修改user表

  • 我们一会使用md5加密
  • md5加密后的字符串长度始终是 32位
  • 所以修改user表中的 password字段为char类型,长度为32

在这里插入图片描述

图片的大小类型可以设置为 : longtext
//----------------------------------------------------------------------------------------
更改头像的时候,如果提示 ”Data too long for column ‘user_pic’ at row 1“,说明你的base64太大了,而text类型只能存 65535个字符。
解决办法一:使用一个小图片,从新生成base64格式
解决办法二:把数据表中的 user_pic 设置为 longtext 类型(可存42亿个字符)或 mediumtext (可存 1600万个字符)

使用 utility 第三方模块对密码进行加密

  • 下载安装 utility
  • login.js 中加载模块
  • 注册的时候,使用 utility.md5(req.body.password) 对密码进行加密

获取用户信息

登录成功,在token中存放正确的username或者id

/**         login.js  */
// 登录成功之后,token中要保存 username 或者 id
res.json({status: 0,message: '登录成功',// token: 'Bearer ' + jwt.sign(要保存的信息, 秘钥, 配置项)// 生成的token前面必须有Bearer,还有一个空格。否则一会token不能正常的解密token: 'Bearer ' + jwt.sign({ username: req.body.username, id: r[0].id }, 'bigevent-9760', { expiresIn: '1h' })
});

获取用户信息接口

/*****     user.js    */
// 获取用户信息
router.get('/userinfo', async (req, res) => {// 查询条件,可以使用username,也可以使用idlet r = await db('select * from user where username=?', req.user.username);// console.log(r);if (r && r.length > 0) {res.json({status: 0,message: '获取用户基本信息成功',data: r[0]});} else {res.json({status: 1,message: '获取用户信息失败'});}
});

回顾:如何获取客户端携带的请求参数

请求方式参数类型服务端如何获取谁控制的
POST查询字符串req.bodyapp.use(express.urlencoded({extended: false}))
POSTFormDatareq.body/req.filemulter中间件(目前没学呢)
GET查询字符串req.queryexpress 封装的属性
GET动态参数req.paramsexpress 封装的属性
GET/POSTtokenreq.userexpress-jwt 中间件控制的

服务端获取到的数据都是对象类型

更新密码接口

  • 判断原密码和新密码是否相同
  • 查询一下,原密码是否正确
  • 更新密码
/*****          user.js   */
// 重置密码
router.post('/updatepwd', async (req, res) => {// 判断两次密码是否一致if (req.body.oldPwd === req.body.newPwd) {return res.json({status: 1,message: '新密码不能和原密码相同'});}// 先根据用户名和原来的密码查询。如果查询到信息,说明原密码正确,是本人操作let a = await db('select * from user where username=? and password=?', [req.user.username, utility.md5(req.body.oldPwd)]);if (a === undefined || a.length === 0) {// 说明没有查到信息,说明原密码不对,不是本人操作return res.json({status: 1,message: '原密码不对'});}// 原密码正确,而且新密码和原密码也不一样,下面进行更新操作let arr = [utility.md5(req.body.newPwd), req.user.username];let r = await db('update user set password=? where username=?', arr);if (r && r.affectedRows > 0) {res.json({status: 0,message: '更新密码成功'});} else {res.json({status: 1,message: '更新密码失败'});}
});

更换头像接口

  • 需要自己生成一个base64格式的字符串,用于测试
    • https://www.css-js.com/tools/base64.html
// 更换头像
router.post('/update/avatar', async (req, res) => {let arr = [req.body.avatar,req.user.username];let r = await db('update user set user_pic=? where username=?', arr);if (r && r.affectedRows > 0) {res.json({status: 0,message: '更新头像成功'});} else {res.json({status: 1,message: '更新头像失败'});}
});

文章类别

设置文章分类表

在这里插入图片描述

获取文章分类列表

// ### 获取文章分类列表
router.get('/cates', async (req, res) => {let r = await db('select * from category');// 只要查询到了,哪怕是空数组,也做出响应if (r) {res.json({status: 0, message: '获取分类成功',data: r});} else {res.json({status: 1,message: '获取分类失败'});}
});

新增文章分类

// ### 新增文章分类
router.post('/addcates', async (req, res) => {let r = await db('insert into category set ?', req.body);if (r && r.affectedRows > 0) {res.json({status: 0,message: '添加分类成功'})} else {res.json({status: 1,message: '添加分类失败'})}
});

根据Id删除文章分类

  • 前端渲染 category.html 的时候,使用的是 {{val.Id}}
    • 修改办法1:打开前端的 /article/category.html ,把模板中的id修改成 {{val.id}}
    • 修改办法2:修改数据库的字段(老师用的这个办法)
// ### 根据Id删除文章分类
router.get('/deletecate/:id', async (req, res) => {// 获取idlet id = req.params.id; // 获取动态参数idlet r = await db('delete from category where id=?', id);if (r && r.affectedRows > 0) {res.json({status: 0,message: '删除分类成功'})} else {res.json({status: 1,message: '删除分类失败'})}
});

根据Id获取文章分类数据

这个接口没有用到,所以不写了

根据Id更新文章分类数据

  • SQL语句中有两个 ? ,所以需要传递一个数组
  • SQL中第一个 ?表示 “字段=值,…”,所以需要为其传递一个对象
  • SQL中第二个 ?表示 Id,需要使用 req.body.Id 来获取Id,因为客户端使用的就是大写的 Id
// ### 根据Id更新文章分类数据
router.post('/updatecate', async (req, res) => {console.log(req.body);let params = [{name: req.body.name,alias: req.body.alias},req.body.Id // 这里必须是大写的Id,否则不能接受到客户端提交的Id];let r = await db('update category set ? where Id=?', params);if (r && r.affectedRows > 0) {res.json({status: 0,message: '修改分类成功'})} else {res.json({status: 1,message: '修改分类失败'})}
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在local模式下的spark程序打包到集群上运行

一、前期准备 前期的环境准备,在Linux系统下要有Hadoop系统,spark伪分布式或者分布式,具体的教程可以查阅我的这两篇博客: Hadoop2.0伪分布式平台环境搭建 Spark2.4.0伪分布式环境搭建 然后在spark伪分布式的环境下必须出现如下八…

APS系统对制造企业到底有多重要?看完这5点你就明白了

第一个问题:需要APS吗? APS是否重要,不能从其所体现的软件工具或系统角度来说,而应该从业务角度来说。对于制造工厂和车间的运行而言,计划是核心的业务。就如同那句俗话说的,没有规矩不成方圆,领…

Node — 第九天 (大事件项目接口实现三)

文章管理接口 设计数据表 添加文章接口 编写接口,使用postman模拟提交formdata类型的数据 在article.js 中,加入 /add 路由 postman模拟提交formdata类型的数据 multer处理文件上传 下载安装multer 加载模块 const multer require(multer) 配置上…

Node — 第九天 (ES6降级 and 发布属于自己的[第三方模块]包)

ES6降级处理 因为 ES 6 有浏览器兼容性问题,可以使用一些工具进行降级处理,例如:babel 降级处理 babel 的使用步骤 安装 Node.js命令行中安装 babel配置文件 .babelrc运行命令,完成降级 项目初始化 (项目文件夹不能有中文) npm …

Vue — 第一天(极速入门)

基本介绍 vue是什么 目标:了解vue的一些基础概念。 官方网站: https://cn.vuejs.org/ vue是:渐进式javascript框架。 两组概念 (1)框架 库。只提供一些API给开发者使用。jquery 是一个js库框架。拥有自己的规则和…

Vue — 第二天(v-model和过滤器)

VUE-02-v-model和过滤器 昨日反馈与回顾 代码仓库的问题 不要修改你克隆下来的仓库中任意代码,否则,下次pull时,可能会报错,从而得到不到最新的代码。 如果已经遇到了这个冲突: 解决冲突(git 中解决冲突)把关键代码…

牛人iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

概览 随着移动互联网的发展,如今的手机早已不是打电话、发短信那么简单了,播放音乐、视频、录音、拍照等都是很常用的功能。在iOS中对于多媒体的支持是非常强大的,无论是音视频播放、录制,还是对麦克风、摄像头的操作都提供了多套…

Vue — 第三天(计算属性和json-server)

计算属性 使用场景 如果一个结果需要依赖data中的数据&#xff0c;但是需要经过一些逻辑处理&#xff0c;才能得到你想要的数据。此时就可以使用计算属性。 例如&#xff1a;要对给定的字符串做翻转处理之后再来显示。 <div id"app"><!-- 此处逻辑复杂 …

Vue — 第四天(components组件)

问题导入 下面的代码是一个折叠面板的效果。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Docu…

iOS开发常用的RGB色值和宏

iOS中RGB常用的色值,同时可将对颜色的设置定义成宏,方便开发应用,如: // name 颜色相关 // 参数格式为&#xff1a;0xFFFFFF #define kColorWithRGB(rgbValue) \ [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16)) / 255.0 \ …

防火墙综合实验

防火墙技术综合实验 一、实验目的&#xff1a;本次实验是将多种访问控制列表以及防火墙部分的知识做一个汇总 二、实验内容 A&#xff1a;Established控制列表 拓扑图 配置步骤 1:配置各端口ip地址&#xff0c;配置登陆密码 R4: 登陆账号&#xff1a;ys 密码&#xff1a;123 2:…

iOS获取当前设备型号等信息总结 包含iPhone7和iPhone7P

#include <sys/types.h> #include <sys/sysctl.h>//获得设备型号(NSString *)getCurrentDeviceModel {int mib[2];size_t len;char *machine;mib[0] CTL_HW;mib[1] HW_MACHINE;sysctl(mib, 2, NULL, &len, NULL, 0);machine malloc(len);sysctl(mib, 2, mac…

Vue — 第五天(路由)

前端路由 问题导入 在前面完成的资产管理案例中&#xff0c; 我们是把列表区域和添加表单区域实现在了一个区域。当页面功能比较复杂时&#xff0c;我们需要它们拆分开来&#xff1a;一个页面中只显示一个区域。 一个比较直观的解决方案是把它们分别做成两个独立的网页文件&…

Vue — 第六天(vue-cli-介绍)

vue-cli-介绍 vue-cli是官方提供的开发vue项目的脚手架工具。 脚手架是为了保证各施工过程顺利进行而搭设的工作平台。 在开发过程中&#xff0c;脚手架工具是有用的&#xff0c;开发完成&#xff08;项目上线&#xff09;&#xff0c;它就没有用了。 vue-cli可以提供基于vue项…

Vue — 第七天(vue-cli-案例)

资料获取地址&#xff1a; github: https://gitee.com/wang_yu5201314/VUE_vuecli SSH&#xff1a; gitgitee.com:wang_yu5201314/VUE_vuecli.git hero案例-项目介绍 功能介绍&#xff1a; 三个模块 英雄列表(只做这个)装备列表技能列表 英雄列表 列表组件删除功能添加组件编…

postman测试工具

做文件上传测试的时候可以选择输入方式为文件 做文件下载测试的时候&#xff0c;可以选择 转载于:https://www.cnblogs.com/thesun/p/10853226.html

webpack — 概述介绍

webpack概述 webpack是一个流行的前端项目构建工具&#xff08;打包工具&#xff09;&#xff0c;可以解决当前web 开发中所面临的困境。 webpack提供了友好的模块化支持&#xff0c;以及代码压缩混淆、处理js兼容问题、性能优化等强大的功能&#xff0c;从而让程序员把工作的…

彻底解决iOS项目中 _OBJC_CLASS_$_XXXService, referenced from: 的类似问题

这是大家熟悉的开发过程中可能遇到的问题 这是提交源码到appStore不支持64位设备的提示 本人在提交项目到appStore时发生的的错误&#xff0c;提示必须要支持64的设备&#xff0c;然后自己赶紧进行相关的适应&#xff0c;出现了类似标题的问题&#xff0c;解决方法如下: 1、…

THUPCCTSAPIO2019:Far Away

流水账~ THUPC nmdwsmduliu&#xff01; THUPC Day -INF~Day -2 大概就是自己做题和每周两次的考试&#xff0c;lsy和fcw两个外校的来吊打我们qwqqq THUPC Day -1 Z208 长沙->北京 在车上看gzy/tjj/xzz打摆&#xff1f; THUPC Day 0 从火车站出来做地铁的时候和tjj做反了可海…

UIDocumentInteractionController之程序间文档共享

iOS中的沙盒可以让平台更加的安全&#xff0c;这也是沙盒给用户带来的最主要好处。不过由于沙盒的严格限制&#xff0c;导致程序之间共享数据比较麻烦。一般在程序间共享文档可以通过UIDocumentInteractionController类实现通讯。它支持在你的app中用其他app预览和显示文档。同…