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响应,拒绝访问。


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NET Core发布 HTTP Error 500.31 - Failed to load ASP.NET Core runtime

记录一下踩过的坑: 首先,不论是500.31还是500.30 ,首先确保安装了三个文件 1.NET Core RunTime 2.NET SDK 3.NET Hosting 其次,确保三个文件的版本一致,如下: 要装就统一装同一个大版本,不要东…

51单片机学习总结(自学)

1、模块化编程 c语言模块化编程实现思路设计代码 具体的程序实现代码如下所示 1:程序的头文件 2:程序的函数文件 3:程序的主文件控制函数的实现 持续更新中......

训练YOLOS-S

文章目录 1 数据处理2 配置训练参数3 可能会遇到的报错 1 数据处理 修改类别数:在models/detector.py中定位到def build(args):,将num_classes进行修改,改为最大的类别id1。我有4个类别,类别id是从0~3,因此max_id3&am…

怎样才能找到合适的产品说明书模板 方法献上

制作一份专业而吸引人的产品手册对于企业来说至关重要。然而,对于许多企业和个人而言,制作产品手册可能是一个挑战,因为需要一定的设计和排版能力。为了帮助大家更轻松地制作出优质的产品手册,下面将向大家推荐三款优秀的产品手册…

如何提高客户消息的快速准确回复能力?

无论是企业还是个人,能够快速而准确地回复客户消息是非常重要的,这不仅可以增强客户对你的信任度,还能促进客户的满意度。 那么,我们该如何提高自己的回复能力呢?接着往下看,你就知道啦! 1、学…

华为埋头造车,躺赚的却是黄牛?

文 | AUTO芯球 作者 | 雷歌 华为和赛力斯正在重庆哼哧a哼哧建厂造车,黄牛却在网上倒卖订单躺着赚钱。 前两天雷歌刚去试驾了问界M9,现场一车难求。 今天回来一看,好家伙,咸鱼上,黄牛们大量倒卖M9的大定订单&#x…

瑞_Java开发手册_(七)设计规约

文章目录 设计规约的意义设计规约 🙊前言:本文章为瑞_系列专栏之《Java开发手册》的设计规约篇。由于博主是从阿里的《Java开发手册》学习到Java的编程规约,所以本系列专栏主要以这本书进行讲解和拓展,有需要的小伙伴可以点击链接…

大物②练习题解

1.【单选题】关于磁场中磁通量,下面说法正确的是( D) A、穿过闭合曲面的总磁通量不一定为零 B、磁感线从闭合曲面内穿出,磁通量为负 C、磁感线从闭合曲面内穿入,磁通量为正D、穿过闭合曲面的总磁通量一定为零 磁感线从…

WebGL在家居设计领域中的应用

WebGL(Web Graphics Library)是一种用于在Web浏览器中进行3D图形渲染的JavaScript API。在家居设计方面,WebGL可以提供一些强大的应用,使用户能够交互式地浏览和体验设计方案。以下是一些家居设计领域中WebGL的应用,希…

Mac安装MySQL

环境 电脑: macOS Monterey 12.7.2 MacBook Pro( Retina, 13-inch, Early 2015) 处理器: 2.7GHz 双核 Inter Core i5 MySQL 的安装版本: 8.2.0 最近有更新系统, 重新配置了电脑, 因此, 之前安装的 MySQL 也都删除了, 这次安装经历有点坎坷, 记录下来, 希望可以帮助到需要的小伙…

Jmeter接口测试实战篇:10分钟学会Jmeter的用法

一提到接口测试,通常大家会有这样的疑问:前端测试不是已经覆盖到各种业务逻辑了吗?为什么还要做接口测试,接口测试和前端测试是不是重复了?对于这个问题,可以从下面几个方面来解释: 什么是接口…

PyCharm中配置安装PyQt5、QtDesigner

PyCharm中配置安装PyQt5 使用 pip install PyQt5 命令安装。 安装pyqt5-tools:pip install pyqt5-tools 安装PyQt5Designer:pip install PyQt5Designer 上述三个都安装好之后,输入 pip list 查看一下 有如下内容就安装成功啦!…

用el-image-viewer实现全局预览图片

背景 在后台管理系统中,一些预览图片的场景,通常都是使用 el-image-viewer 去实现,但是如果多个地方都需要预览图片,又要重复的去写 el-image-viewer 以及一些重复的和预览相关的代码。 可以把预览图片的组件放在根文件&#x…

java基础 - 05 Vector

Vector 学过C的同学都知道,Vector也在C中存在,他可以说是两种编程语言中都存在的数据结构,但是值得我们注意的是,Vector在java中和在C中是存在差别的,在Java中,Vector是一个数组。并且他是动态的&#xff…

记一次 JMeter 压测 HTTPS 性能问题

问题背景 在使用 JMeter 压测时,发现同一后端服务,在单机 500 并发下,HTTP 和 HTTPS 协议压测 RT 差距非常大。同时观测后端服务各监控指标水位都很低,因此怀疑性能瓶颈在 JMeter 施压客户端。 问题分析 切入点:垃圾…

vue3.2二次封装antd vue 中的Table组件,原有参数属性不变

vue3.2中的<script setup>语法 在项目中多处使用到表格组件,所以进行了一个基础的封装,主要是通过antd vue 中表格的slots配置项,通过配合插槽来进行封装自定义表格; 这次主要的一个功能是编辑之后变成input框 修改了之后变成完成发送请求重新渲染表格&#xff1a; 子…

【Android Gradle 插件】Android 依赖管理 ① ( 依赖库匹配 | 依赖库查找顺序及路径 | Gradle 资源库 )

一、依赖库匹配 依赖库匹配 : 依赖库由三部分组成 依赖库分组依赖库名称依赖库版本号 只有三者都对上 , 依赖库才能匹配上 , 如 dependencies {implementation androidx.appcompat:appcompat:1.3.1 }依赖库分组为 androidx.appcompat , 依赖库名称为 appcompat , 依赖库版本…

QT DAY6作业

1.学生管理系统&#xff0c;基于QT的数据库中数据表的增删改查 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> //执行sql语句类 #include <QSqlRecord> //数据库记…

工信部颁发的人工智能证书《自然语言与语音处理设计开发工程师》证书到手啦!

工信部颁发的人工智能证书《自然语言与语音处理设计开发工程师》证书拿到手啦&#xff01; 近期正在报考的工信部颁发的人工智能证书还有&#xff1a; 《计算机视觉处理设计开发工程师》中级 2024年1月24日至28日-北京 《自然语言与语音处理设计开发工程师》中级 第二期 20…

定位Linux下写句柄错误问题

编写代码时发现对于以下can 写资源句柄时出现的错误不是很能分析&#xff0c;但是如果将错误码打印出来后&#xff0c;清晰了很多&#xff0c;并且还可以查看。 int Can::Write(const struct can_frame *send_frame) { int result;std::cout << "before write s_ :…