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

关于JS错误处理

node中和mysql中的错误处理

node和MySQL提供的方法,已经对错误信息进行了封装,只需要使用 err.message 即可获取到错误信息。

比如:

const fs = require('fs');
// 读取一个不存在的文件
fs.readFile('abcd.txt', (err, data) => {if (err) return console.log(err.message); // ENOENT: no such file or directory, open 'abcd.txt'console.log(data);
});

比如:试着修改下面的代码,让代码产生错误,然后可以通过 err.message获取到错误信息

function db (sql, params, cb) {const mysql = require('mysql');const conn = mysql.createConnection({host: 'localhost',user: 'root',password: '12345678',database: 'user'});conn.connect();conn.query(sql, params, cb);conn.end();
}db('insert into books set ?', {bookname: 'aaa', author: 'bbb', publisher: 'ccc'
}, (err, result) => {if (err) return console.log(err.message);console.log(result);
});

JS中的错误处理


// 使用try...catch...finally...这种语句可以获取错误信息
// try : 尝试
// catch : 捕获、抓
// finally : 最终// 语法
/*** try { ... } catch (e) { ... }* * try { ... } finally { ... }* * try { ... } catch (e) { ... } finally { ... }*/// function abc () {
//     console.log(123);
// }// try {
//     abc();
// } catch (e) {
//     // e 是一个错误对象
//     console.log(e.message); // abc is not defined
// }try {abc();
} catch (e) {console.log(e.message);
} finally {console.log('哈哈哈');
}

try里面有大段的代码,那么也是执行这一大段代码,如果哪一行出了错误,会终止try里面代码的执行,并且会把错误交给catch来处理。

new Error()

Error是JS内置对象,用于创建错误对象。

语法:

new Error('错误信息', '产生错误的文件', '错误的行号');
// 使用的时候,一般后面两个参数不用填,默认使用当前的文件,错误的行号使用产生错误哪一行的行号。

throw关键字

throw 关键字用于抛出错误。

throw 后面可以跟数字、字符串、对象等等。

通过throw抛出的错误,可以被catch捕获到。

  • throw 字符串
    • catch 中,使用 e 获取错误信息
  • throw new Error(‘哈哈哈’);
    • catch 中,使用 e.message 获取错误信息
try {// throw 'hahah';throw new Error('我自己定的错误');
} catch (e) {// console.log(e);console.log(e.message);
}
//===============================================================================

搭建大事件接口项目

已知使用到的第三方模块有:

//设置跨域
const cors = require('cors');
//路径查找
const path = require('path');
//设置分类路由,及请求体
const express = require('express');
// 使用express-jwt模块,控制 以 /my 开头的接口,需要正确的token才能访问
const expressJWT = require('express-jwt');
//设置登录权限,加载jsonwebtoken模块(用于生成token加密串)
const jwt = require('jsonwebtoken');
//设置md5的密码加密设置
const utility = require('utility');
//链接数据库
const mysql = require('mysql');
//用于获取formdata类型的请求体,同时完成文件上传
const multer = require('multer');

创建项目目录

创建 big-event-server 文件夹

下载安装第三方模块

npm init -y
npm i express mysql cors multer express-jwt jsonwebtoken
  • express 用于搭建服务器
  • mysql 用于操作数据库
  • cors 用于解决跨域
  • multer 用于完成文件上传
  • express-jwt 用于解密token字符串
  • jsonwebtoken 用于加密token字符串

创建routers文件夹,准备路由文件

项目根目录创建了routers文件夹,里面创建如下四个路由文件

  • user.js 用于完成 个人中心 所需的接口
  • login.js 用于完成 登录、注册接口
  • article.js 用于完成 文章模块 所需的接口
  • category.js 用于完成 文章类别 所需的接口

四个路由文件中,里面添加如下基础代码

const express = require('express');
const router = express.Router();// router.get('xxx', async (req, res) => {// });module.exports = router;

创建app.js,开启服务

const path = require('path');const express = require('express');
const app = express();
app.listen(3007, () => console.log('大事件服务器启动了'));// 加载路由模块,并注册成中间件
app.use('/api', require(path.join(__dirname, 'routers', 'login')));
app.use('/my/article', require(path.join(__dirname, 'routers', 'category')));
app.use('/my/article', require(path.join(__dirname, 'routers', 'article')));
app.use('/my', require(path.join(__dirname, 'routers', 'user')));

路由模块的前缀,我们参考 刘龙宾 老师的接口文档,和他的接口一样即可。
大事件接口提示入口:

封装db

/*** 导出函数,作用是完成mysql操作(增删改查)* @param sql SQL语句* @param params 为SQL语句中的占位符传递的值,默认是null* @returns Promise对象*/
module.exports = (sql, params = null) => {const mysql = require('mysql');const conn = mysql.createConnection({host: 'localhost',user: 'root',password: '12345678',database: 'big-event', // 数据库一会创建 });return new Promise((resolve, reject) => {conn.connect();conn.query(sql, params, (err, result) => {err ? reject(err) : resolve(result);});conn.end();});
}

使用Git管理项目

# 初始化
git init

模块化阻止文件 .gitignore

接下来,需要执行add和commit命令把基础的代码提交到本地仓库。但是 第三方模块 没有必要提交到仓库,所以可以设置忽略文件 (.gitignore),内容如下:

# # 表示注释
# 下面设置项目忽略的文件# 忽略abc.js文件
abc.js# 忽略xyz文件夹里面所有的文件
xyz# 忽略 node 第三方模块
package-lock.json
node_modules

设置忽略之后,可以执行 git add .git commit -m '提交了初始的代码'

如果需要上传至 ‘码云’ 或 ‘github’ 教程须知 https://blog.csdn.net/weixin_44694682/category_9920006.html

设置应用级别的中间件

  • 解决跨域

  • post请求体(urlencoded类型,也就是查询字符串类型)

  • 开放静态资源(开放上传后的图片)

/*                   app.js 加入如下代码: */
const cors = require('cors');
// ----------  加载路由模块之前,设置应用级别的中间件
// 解决跨域
app.use(cors());
// 接收 urlencoded 类型的请求体
app.use(express.urlencoded({extended: false}));
// 开放静态资源(uploads)uploads 文件夹要放上传的图片
app.use(express.static('uploads'));

JWT身份认证

  • J: json
  • W:web
  • T:token

就是一种前后端分离模式使用的身份认证方式。

原理图

在这里插入图片描述

实现身份认证

想要完成jwt方式的身份认证,需要一下两个第三方模块

  • express-jwt 用于解密token字符串,还可以控制哪些接口需要身份认证。
  • jsonwebtoken 用于加密token字符串
1、登录的接口,要给客户端返回token
2、控制其他接口,必须携带正确的token才能访问
3、其他需要权限的接口中,能够使用token中保存的数据(用户名)
4、如果身份认证失败,服务器要响应 {status: 1, message: '身份认证失败!'}

登录成功之后,生成token

在login.js中

  • 加载jsonwebtoken模块
  • 使用该模块的 sign 方法生成token加密串
  • 返回给客户端的时候,要在加密串前面加上 “Bearer

参考代码:

/*          login.js  */
// 加载jsonwebtoken模块(用于生成token加密串)
const jwt = require('jsonwebtoken');// 登录的接口
router.post('/login', async (req, res) => {// 假设账号是 admin,密码是 111111if (req.body.username === 'admin' && req.body.password === '111111') {// 登录成功res.json({status: 0,message: '登录成功',// token: 'Bearer ' + jwt.sign(要保存的信息, 秘钥, 配置项)// 生成的token前面必须有Bearer,还有一个空格。否则一会token不能正常的解密token: 'Bearer ' + jwt.sign({username: 'admin', age: 20}, 'bigevent-9760', {expiresIn: 2*60*1000})});}
});

使用express-jwt控制 以 /my 开头的接口,必须加入token才能访问

在 app.js 中

  • 加载 express-jwt 模块
  • 配置中间件,指定哪些接口不需要身份认证
// 使用express-jwt模块,控制 以 /my 开头的接口,需要正确的token才能访问
const expressJWT = require('express-jwt');
// 下面一行代码的意思是,除了以 /api 开头的接口,其他所有接口都需要身份认证才能访问
app.use(  expressJWT({ secret: 'bigevent-9760' }).unless({path: /^\/api/})  );

使用Postman来测试

  • 请求的时候,header头如果没有token,是否报错了
  • 请求的时候,header头如果有token,是否可以正常访问

使用错误中间件统一处理身份认证失败的情况

在 app.js 最后的位置,加一个错误中间件

// 错误中间件,统一处理tokne的问题
app.use((err, req, res, next) => {// 真的token问题,做判断if (err.name === 'UnauthorizedError') {console.log(err.message);res.json({status: 1,message: '身份认证失败!'});}
});

在其他路由中,可以使用req.user对象,获取到token中保存的数据

登录和注册

创建数据库、数据表

创建 big-event数据库

创建user表:

在这里插入图片描述

注册

  • 接收post请求体
  • 写insert语句,完成添加
let r = await db('insert into user set ?', req.body);
if (r.affectedRows > 0) {res.json({status: 0,message: '注册成功'});
} else {res.json({status: 0,message: '注册失败'});
}

这个代码,不够严谨。如果SQL出现一点点问题,就会报一大段错误,并且也不会做下响应。

使用try…catch 来解决问题

修改后的代码如下:

// 注册的接口
router.post('/reguser', async (req, res) => {// 获取post请求体(也就是用户提交的账号和密码)// 添加到 user 表 中// console.log(req.body); // { username: 'admin', password: '111111' }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: '注册失败'});}
});

思考:

  1. 除了try…catch… 你还能想到其他办法吗?
  2. 其他接口也需要使用try…catch完成SQL的执行,有没有统一的解决办法?

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

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

相关文章

1.Consul 简介和环境搭建

1.什么是 Consul Consul 是 service mesh(服务网格)的一个解决方案,它提供了诸如服务发现,配置和隔离等功能的一整套控制平面(control plane)。开发人员可以根据需要单独使用这些功能点,也可以将他们整合成为一个完整的service mesh。Consul …

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

如何处理MySQL的错误 MySQL的错误信息,可以通过err来获取。这是没有问题的。 但是,我们加入了Promise,Promise中的错误,在外部是获取不到的,只能使用Promise相关方法来获取错误信息。 解决方法一 使用 JS原生的 tr…

在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、…