做网站外快,网站建站哪个好,蓝色旅游网站模板,丹东 建设集团 招聘信息网站如何处理MySQL的错误
MySQL的错误信息#xff0c;可以通过err来获取。这是没有问题的。
但是#xff0c;我们加入了Promise#xff0c;Promise中的错误#xff0c;在外部是获取不到的#xff0c;只能使用Promise相关方法来获取错误信息。
解决方法一
使用 JS原生的 tr…如何处理MySQL的错误
MySQL的错误信息可以通过err来获取。这是没有问题的。
但是我们加入了PromisePromise中的错误在外部是获取不到的只能使用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); // 如果有错误rundefined。否则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); // 如果有错误rundefined。否则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 第三方模块对密码进行加密
下载安装 utilitylogin.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: 修改分类失败})}
});