Express框架使用全流程

1.目的和使用场景

对于像我这样不常使用 Node.js 进行开发的人来说,每次开始一个新项目都意味着从头开始设置环境,这个过程相当繁琐。因此,我决定自己构建一个开箱即用的项目脚手架。我的目标是创建一个简单易用的基础框架,能让我(和任何人)直接投入日常的开发工作,无需预先的配置麻烦。本篇博客就是为此而生。

本文旨在为初学者提供全面的指导,从零开始,一步步构建起一个功能完备的开发环境。只要跟随本文的步骤,你也能轻松搭建起自己的 Node.js 项目。

ps:我已将搭建的框架上传了。需要直接使用express模板的同学可以点击链接下载

https://download.csdn.net/download/wanghaoyingand/88746686?spm=1001.2014.3001.5501icon-default.png?t=N7T8https://download.csdn.net/download/wanghaoyingand/88746686?spm=1001.2014.3001.5501


2.框架的搭建详细步骤

前置条件:你的电脑已经下载过node,推荐使用nvm可以方便的切换node版本

第一步,初始化项目

桌面新建一个空文件夹,名字随便取,最好英文,打开cmd命令输入`npm init `这会创建一个package.json文件

第二步,下载express-generator 

express-generator 是express官方提供的脚手架

npm i express-generator  // 下载完成后验证:
express --version

第三步,创建脚手架

express 项目名称
比如 : express mysite-express

第四步,安装依赖

npm i

第五步,启动

npm start

第六步,删除无用目录,使用三层架构

删除views文件夹,新建dao、service文件夹

  1. 路由层(Routes Layer): 负责处理客户端的请求,根据不同的 URL 路径和 HTTP 方法(如 GET、POST)将请求转发到对应的处理器。

  2. 服务层(Service Layer): 包含业务逻辑,服务层会处理来自路由层的请求,执行所需的业务操作。这一层通常会与数据访问层(DAO)交互,以获取和修改数据。

  3. 数据访问层(Data Access Layer, DAO): 这一层通常使用模型(Model)来与数据库交互。它负责数据的持久化,包括查询数据库、更新记录等操作。

 每一层都有明确的职责,这有助于代码的组织和维护。路由层不应包含业务逻辑,服务层应专注于业务规则,数据访问层应仅处理数据。

 


 第七步 配置数据库

前置条件:你的电脑得先安装数据库如mysql等

下载数据库orm:
npm install --save sequelize  mysql2

/  dao/dbConnect.js文件

我使用的是环境变量的方式设置,可以方便管理,插件名字叫dotenv直接npm i dotenv即可

DB_HOST=localhost

DB_USER=数据库用户名

DB_PASS=密码

DB_NAME=是数据库名字

JWT_SECRET = weiyi

const { Sequelize } = require('sequelize');// 使用 URI 连接数据库const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, {host: process.env.DB_HOST,dialect: 'mysql', // 或 'mysql', 'sqlite', 'mssql'logging:false  //生成的sql语句不会再控制台显示
});
// 测试数据库链接是否成功
// (async function(){
//   try {
//     await sequelize.authenticate();
//     console.log('Connection has been established successfully.');
//   } catch (error) {
//     console.error('Unable to connect to the database:', error);
//   }
// })()module.exports = sequelize;

第八步,错误类的编写

utils/error.js

这个各位参考下,根据自己的实际情况修改

// 自定义错误,当错误发生的时候,我们捕获到错误,然后抛出我们自定义的错误\
/* 业务处理错误基类
*/class ServiceError extends Error{/* message 错误的消息code 错误的消息码*/constructor(message,code){super(message)this.code = code}// 方法,返回给客户端的格式toResponseJSON() {return {error: {message: this.message,code: this.code}};}
}// 文件上传错误
class UploadError extends ServiceError {constructor(message) {super(message, 413);}
}// 禁止访问错误
class ForbiddenError extends ServiceError {constructor(message) {super(message, 401);}
}// 验证错误
class ValidationError extends ServiceError {constructor(message) {super(message, 400);}
}// 无资源错误
class NotFoundError extends ServiceError {constructor(message) {super(message, 404);}
}// 未知错误(其他错误)
class UnknownError extends ServiceError {constructor(message) {super(message, 500); // 使用 HTTP 状态码 500 表示服务器内部错误}
}
module.exports = {ServiceError,UploadError,ForbiddenError,ValidationError,NotFoundError,UnknownError
};
// 测试一个特定的错误
try {throw new UploadError('上传文件错误222');
} catch (error) {console.log(error.toResponseJSON()); // 输出错误信息的 JSON 表示
}

第九步,后端响应格式封装

utils/error.js

/* 
格式化响应数据
*/module.exports.formatResponse = function(code,data,message){return{"code":code,"data":data,"message":message,"status":"OK"}
}

至此位置,项目算是搭建完成了。

3.后端实现jwt功能

需要的插件:

 npm i jsonwebtoken  //生成令牌
使用步骤:
1导入 :const jwt = require('jsonwebtoken')
2.使用:const token = jwt.sign({id:dataValue.id,loginId:dataValue.loginId,},md5(process.env.JWT_SECRET),{expiresIn:60*60*loginPeriod})npm i express-jwt  // 验证令牌
使用步骤:
1.导入var expressJWT = require("express-jwt");
2.使用:
app.use(expressJWT.expressjwt({ secret: md5(process.env.JWT_SECRET), algorithms: ['HS256'] 
}).unless({path: [ '/admin/login']
}));

因为这个功能集成进去了,所以稍微提一嘴。

以下是该流程的详细步骤:

1. 用户登录:
   - 前端提供用户名和密码等身份验证信息发送到后端进行验证。

2. 验证身份:
   - 后端接收到用户提供的信息,验证用户名和密码是否正确。
   - 如果用户名和密码正确,后端生成一个JWT令牌。

3. 生成JWT令牌:
   - JWT令牌包括用户的身份信息和其他必要的信息,如过期时间。
   - 后端使用密钥对这些信息进行签名,以确保令牌的完整性和安全性。
   - 后端将生成的JWT令牌发送回前端。

4. 前端存储JWT令牌:
   - 前端接收到JWT令牌后,通常将其存储在本地,如浏览器的localStorage

5. 将JWT令牌发送到后端:
   - 每当前端需要访问需要身份验证的资源时,它将JWT令牌附加到HTTP请求的请求头中,通常使用“Authorization”头字段。

6. **后端验证JWT令牌**:
   - 后端使用express-jwt或其他JWT验证库来解析和验证JWT令牌。
   - 后端检查JWT的签名是否有效,以确保令牌没有被篡改。
   - 后端检查JWT是否在有效期内。
   - 如果JWT验证成功,后端允许访问所请求的资源。
   - 如果JWT验证失败,后端返回HTTP 401 Unauthorized响应,拒绝访问。


 还有一些好用和方便的中间件就不写了,可以参考下图:

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

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

相关文章

力扣337. 打家劫舍 III(java 动态规划)

Problem: 337. 打家劫舍 III 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 1.构建多阶段决策模型:树形DP基于树这种数据结构上的推导,一般都是从上往下推,子节点状态推导父节点状态,一般都是基于后续遍历来实现。 2.定…

“一键批量处理:轻松缩小图片像素,提升工作效率“

"在忙碌的工作中,时间就是金钱。使用我们的图片批量处理工具,轻松缩小图片像素,让您的工作更加高效。一键操作,告别繁琐,让您有更多时间享受生活。高效工作,从这里开始!" 第一步&…

postman 简单测试(一)

1.postman官网 Postman API Platform 2.研究了一下postman 一些简单的功能,自己做个记录,同时希望能节约点测试时间。 2.1新建一个 collections 长期测的话,最好注册一个账号,开放更多功能。 2.2新建一个请求 后端要先搭建起来…

ModuleNotFoundError: No module named ‘SwissArmyTransformer‘

小问题,直接pip install pip install SwissArmyTransformer 但是,安装之后却还是提示,屏幕上依然标红 ModuleNotFoundError: No module named SwissArmyTransformer 查找环境目录发现, 这是因为新版的SwissArmyTransformer中&…

关键信息基础设施安全相关材料汇总

文章目录 前言一、法律(1)《中华人民共和国国家安全法》(2)《中华人民共和国网络安全法》(3) 《中华人民共和国密码法》(4)《中华人民共和国数据安全法》(5) 《中华人民共和国个人信息保护法》二、行政法规(6)《中华人民共和国保守国家秘密法实施条例》(7) 《关键信息基础设施安…

AI嵌入式K210项目(6)-开启双核模式

文章目录 前言一、K210双核心和BSP介绍二、实验过程代码实现 总结 前言 前面我们在介绍K210时提及到,K210芯片中有两个RISC-V核心,一般情况下,只有一个核心在运行,本章将介绍如何开启双核模式。 一、K210双核心和BSP介绍 K210系…

CXYGZL-程序员工作流,持续迭代升级中

概述 现在开源的工作流引擎,基本都是以BPMN.js为基础的,导致使用门槛过高,非专业人员无法驾驭。本工作流借鉴钉钉/飞书的方式,以低代码方式降低用户使用门槛,即使是普通企业用户也可以几分钟内就能搭建自己的工作流引…

CC工具箱使用指南:【获取所有字段信息】

一、简介 这个工具的目的简单易懂,就是获取选定要素图层的所有字段信息。 本身不对要素图层作任何处理,只是一个查看属性的工具。 问我要用在什么地方,我也不知道-_- 二、工具参数介绍 点击【信息获取】组里的【获取所有字段信息】工具&a…

Vue3中使用自定义指令

一,自定义指令: 应用场景:禁用按钮多次点击 1.vue2 a. src/libs/preventClick.js import Vue from vue const preventClick Vue.directive(preventClick, {inserted: function (el, binding) {el.addEventListener(click, () > {if (!el…

网络协议与攻击模拟_04ICMP协议与ICMP重定向

ICMP协议是网络层协议, 利用ICMP协议可以实现网络中监听服务和拒绝服务,如 ICMP重定向的攻击。 一、ICMP基本概念 1、ICMP协议 ICMP是Internet控制报文协议,用于在IP主机、路由器之间传递控制消息,控制消息指网络通不通、主机是…

windows系统下docker软件中使用ubuntu发行版本的linux系统

1.软件下载 官网下载地址 下载安装之后,再去微软商店下载wsl软件,可以直接用,或者也可以使用命令行拉取(下面会讲) 2.在docker里面创建容器的两种方法 2.1.命令行创建 前言:输入 winr 打开命令行进行下面…

【经典算法】有趣的算法之---遗传算法梳理

every blog every motto: You can do more than you think. 0. 前言 遗传算法是一种基于自然选择和遗传机制的优化算法,因此它通常被用于求解各种最优化问题,例如函数优化、特征选择、图像处理等。 一言以蔽之: 将数学中的优化问题&#xf…

Rust 基础语法

本章主要了解可变变量、不可变变量、函数、基本类型、注释、所有权、借用。 1、定义变量,Rust中有可变变量和不可变变量的区别,不废话上代码 fn main() {//创建一个不可变的变量xlet x5;//创建一个可变的变量ylet mut y6;x10;y11;//打印变量x、y的值pr…

高级分布式系统目录汇总

临近《高级分布式系统》考试,所以一边复习((⊙o⊙)…,其实是预习,哈哈^_^),一边写高级分布式博客。先将高级分布式章节以及相关博客罗列如下,欢迎和大家一起学习。资料部分参考上了以下教材: 分布式实时系统…

接口interface--java学习笔记

认识接口 java提供了一个关键字interface,用这个关键字可以定义出一个特殊的结构:接口在接口里面定义的变量,不管加不加public static final修饰都默认为常量,必须赋初值在接口里面定义的方法,不管加不加public abstr…

武汉灰京文化:抓住用户心理,游戏推广不可或缺的前提

在当今激烈竞争的游戏市场中,了解目标用户成为游戏推广的不可或缺的前提。不同类型的游戏适合不同的用户群体,因此通过深入研究用户画像,准确定位目标用户群体,成为游戏成功推广的关键一环。游戏推广不仅仅是让更多的人知道游戏的…

MOJO交互

文章目录 Mojo不仅非常适合编写高性能代码,而且还允许我们利用庞大的Python库和工具生态系统。有了无缝的Python互操作性,Mojo可以使用Python做它擅长的事情,尤其是gui,而不会牺牲关键代码的性能。让我们以经典的Mandelbrot集合算…

运筹说 第84期 | 网络计划-网络图的基本概念

自华罗庚教授将网络计划技术引入我国,网络计划已取得巨大发展。本期开始,小编将从网络图基本概念、时间参数计算、网络计划优化和图解评审法等方面对网络计划进行系统的介绍。 01前言 20世纪50年代以来,产生了许多计划管理的新方法&#xf…

【java八股文】之计算机网络系列篇

1、TCP/IP和UDP模型 TCP/IP分层(4层):应用层,传输层,网络层,数据链路层 网络的七层架构 (7层):应用层,表示层,会话层,传输层&#xff…

【健康小贴士】关节炎是不是冻出来的?

大家冬天肯定被父母唠叨过: 「天气这么冷,裤子穿这么短,小心得关节炎!」 ❌这种说法其实是不对的或者并不全面,答案来了👀