如何处理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.body app.use(express.urlencoded({extended: false}))
POST FormData req.body/req.file multer中间件(目前没学呢)
GET 查询字符串 req.query express 封装的属性
GET 动态参数 req.params express 封装的属性
GET/POST token req.user express-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: '修改分类失败'})}
});

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

  1. Node — 第七天 (大事件项目接口实现一)

    关于JS错误处理 node中和mysql中的错误处理 node和MySQL提供的方法,已经对错误信息进行了封装,只需要使用 err.message 即可获取到错误信息. 比如: const fs = ...

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

    文章管理接口 设计数据表 添加文章接口 编写接口,使用postman模拟提交formdata类型的数据 在article.js 中,加入 /add 路由 postman模拟提交formdata类型的数 ...

  3. 45 大事件项目 => [01] 后台管理项目ajax练习

    目标 利用Git管理大事件项目代码 安装并且使用 Live Server插件 学会查阅layui文档 绘制出登录注册页面结构 添加表单元素自定义验证规则 查阅接口文档完成登录注册功能 知道iframe ...

  4. 黑马-大事件项目(总结+BUG修复)

    前言 最近把Nodejs和Ajax学习了一下,找到一个很不错的练手项目:黑马刘龙彬老师主讲的大事件项目,整体看完,给刘老师点个赞,讲的非常细致,开发流程清晰,涉及的知识点也很精准.另外黑马还为这个项目 ...

  5. Ajax — 大事件项目(第三天)

    大事件-03 用户信息 表单验证 html中,直接使用layui提供的内置验证规则 email <input type="text" name="email&quo ...

  6. Ajax — 大事件项目(第二天)

    大事件-02 fix一个bug 原因: 开始做注册的时候,页面中只有一个 name=password的input,所以 $('input[name="password"]') 可以 ...

  7. 超详细讲解大事件项目api接口

    文章目录 1. 初始化 1.1新建项目 1.2 配置 cors 跨域 1.3 配置解析表单数据的中间件 1.4 初始化路由相关的文件夹 1.5 初始化用户路由模块 1.6 抽离用户路由模块中的处理函数 ...

  8. Ajax — 大事件项目(第四天)

    分类管理 添加分类 初步使用弹出层 给 "添加分类" 绑定一个单击事件 单击事件中,使用 layer.open() 实现一个弹出层 type: 1, 弹层的类型是页面层 title ...

  9. Ajax — 大事件项目(第一天)

    应用的前端技术 Ajax (重要) - jQuery方式接口请求 Layui 框架使用 HTML + CSS + JS 项目说明和演示 线上 DEMO 项目地址:http://www.liulongb ...

最新文章

  1. Python中format_map与format字符串格式化的区别
  2. SSIS Dataflow使用存储过程不能检索列名
  3. android方法是对象吗,为什么android中对象不初始化也能调用方法?
  4. bzoj 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路(floyd)
  5. 小孩看python_小朋友,python是否让你有很多问号?
  6. Collectors.summingDouble()
  7. [转载]CMMI之功能点估算法:EI、EQ和EO
  8. ubuntu下配置IP地址
  9. 基于vue的手机阅读小说类webapp
  10. 利用 adb 对手机进行屏幕分辨率设置
  11. spring-test部分翻译
  12. 快速入门Opentracing-cpp
  13. 使用Python代码下载网易音乐歌曲
  14. 中小科技企业新蓝图,抓住资本新机遇!北京证券交易所要来了
  15. java中小写字母转化大写字母,大写字母转化小写字母
  16. 迅雷2014C++研发笔试卷C解题分析
  17. Leetcode_24_Swap Nodes in Pairs
  18. 导出的 EXCEL 用 office2016 打不开
  19. Wayland utilizing Android GPU drivers on glibc based systems, Part 1
  20. [英语语法]词法之独立主格

热门文章

  1. iOS开发-缓存图片到沙盒--思路
  2. malloc()函数解析
  3. 【目标检测】cvpr21_Sparse R-CNN: End-to-End Object Detection with Learnable Proposals
  4. Python中机器学习的特征选择技术
  5. 网络协议分层及报文格式大全
  6. Ubuntu开启telnet服务
  7. 农村民间借贷一分利息,有借条受法律保护吗?
  8. 现金贷平台倒闭后,借的钱是否可以不还?
  9. 你以为有白金卡就很牛逼?错!
  10. 什么叫白户,白户能贷款吗?