Express框架使用全流程

news2024/12/23 22:33:25

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.coloradmin.cn/o/1389141.html

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

相关文章

Html+Css+JavaScript实现完整的轮播图功能

概要 这个案例具备常见轮播图完整的功能,大家可以根据自己的需求去修改; 代码可以直接复制运行,需要安装sass 主要功能: (1)鼠标移入轮播图,左右两边的按钮出现,离开则隐藏按钮&a…

maven私有仓库和公有仓库混合使用

<?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/SETTINGS/1…

测量鼠标DPI的三种方法,总有一种适合你

DPI(dots per inch)代表每英寸点数,是一种用于各种技术设备(包括打印机)的测量方法,但对于鼠标来说,指的是鼠标在桌面上移动1英寸的距离的同时,鼠标光标能够在屏幕上移动多少“点”。 许多游戏鼠标都有按钮,可以让你在玩游戏时动态切换DPI,但如果你不知道鼠标的DPI怎…

黑马程序员——javase基础——day01——Java入门IDEA基础语法

目录&#xff1a; Java入门 Java简介JDK的下载和安装第一个程序常见问题常用DOS命令Path环境变量IDEA IDEA概述和安装IDEA中HelloWorldIDEA中基本配置&注释IDEA中常用快捷键IDEA中模块操作基础语法 字面量数据类型变量变量的案例 手机信息描述疫情防控信息采集表变量的注意…

引领未来:话务数据展示大屏助力企业决策

在当今信息爆炸的时代&#xff0c;企业需要一个直观、高效的数据展示平台来帮助他们快速获取、分析和决策。山海鲸可视化话务数据展示大屏&#xff0c;就是这样一款引领企业迈向高效决策新纪元的产品。 一、什么是山海鲸可视化话务数据展示大屏&#xff1f; 山海鲸可视化是一款…

Androidmanifest文件加固和对抗

前言 恶意软件为了不让我们很容易反编译一个apk&#xff0c;会对androidmanifest文件进行魔改加固&#xff0c;本文探索androidmanifest加固的常见手法以及对抗方法。这里提供一个恶意样本的androidmanifest.xml文件&#xff0c;我们学完之后可以动手实践。 1、Androidmanife…

LLM:Scaling Laws for Neural Language Models (中)

核心结论 1&#xff1a;LLM模型的性能主要与计算量C&#xff0c;模型参数量N和数据大小D三者相关&#xff0c;而与模型的具体结构 (层数/深度/宽度) 基本无关。三者满足: C ≈ 6ND 2. 为了提升模型性能&#xff0c;模型参数量N和数据大小D需要同步放大&#xff0c;但模型和数…

这三款内网管理监控软件让你事半功倍

在当今高度信息化的时代&#xff0c;企业内部网络&#xff08;内网&#xff09;已经成为企业运营和发展的重要支撑。 然而&#xff0c;随着内网规模的扩大和复杂性的增加&#xff0c;内网的管理和监控也变得越来越困难。 为了提高内网的管理效率和工作效率&#xff0c;许多企…

在Linux上使用PHP-FPM与Nginx实现高效的HTTP处理

当谈到高效的HTTP处理时&#xff0c;PHP-FPM&#xff08;FastCGI进程管理器&#xff09;与Nginx的结合是许多web开发者的首选。这种组合提供了出色的性能、可扩展性和稳定性&#xff0c;尤其适用于高流量的网站和应用程序。 1. 为什么选择PHP-FPM与Nginx&#xff1f; 性能优化…

excel(vab)删除空行

删除第一、二、三列位空的所有行&#xff08;8000)行范围以内 代码如下&#xff1a; Sub Macro1()Dim hang As Integer For hang 8000 To 1 Step -1If Sheet1.Cells(hang, 1) "" And Sheet1.Cells(hang, 2) "" And Sheet1.Cells(hang, 3) "&quo…

2024 基于 Rust 的 linter 工具速度很快

2024 年 Web 工具的一大趋势是使用 Rust 重写现有工具。Rust 是一种出色的编程语言&#xff0c;能生成运行速度惊人的二进制文件&#xff0c;且与其它 Web 工具的互操作性极佳&#xff0c;这得益于 WebAssembly 的帮助。swc 和 Turbopack 等工具的速度提升为快速开发体验带来了…

代码随想录算法训练营第24天 | 理论基础 77. 组合

目录 理论基础 什么是回溯法 回溯法的效率 回溯法解决的问题 如何理解回溯法 回溯法模板 77. 组合 &#x1f4a1;解题思路 &#x1f4bb;实现代码 理论基础 什么是回溯法 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 回溯法的效率 虽然回溯法很难&#xff…

Nestjs 笔记

一、模块添加版本 1、添加如下代码 2、访问方式 http://localhost:3000/v1/list 二、跨域处理 1、安装依赖 npm install corsnpm install types/cors -D 2、app.module.ts 添加代码 import { NestFactory } from nestjs/core; import { AppModule } from ./app.module; i…

QQ视频聊天怎么录制

虽然微信几乎成为主流的聊天工具&#xff0c;但是不可否认的是QQ视频聊天仍有他的趣味所在&#xff0c;多种特效在视频的时候增加乐趣&#xff0c;那么如果QQ视频聊天的时候可以录制聊天内容吗&#xff1f;当然是可以的。可以使用电脑自带的视频录制工具&#xff0c;或者QQ自带…

k8s的存储卷、数据卷---动态PV创建

当发布PVC之后可以生成PV&#xff0c;还可以在动态服务器上直接生成挂载目录。PVC直接绑定和使用PV。 动态PV需要两个组件 存储卷插件&#xff1a;Provisioner(存储分配器)根据定义的属性创建PV StorageClass&#xff1a;定义属性 存储卷插件 存储卷插件&#xff1a;k8s本…

电脑安装 Python提示“api-ms-win-crt-process-l1-1-0.dll文件丢失,程序无法启动”,快速修复方法,完美解决

在windows 10系统安装完python后&#xff0c;启动的时候&#xff0c;Windows会弹出错误提示框“无法启动此程序&#xff0c;因为计算机中丢失了api-ms-win-crt-process-l1-1-0.dll&#xff0c;尝试重新安装该程序以解决此问题。” api-ms-win-crt-process-l1-1-0.dll是一个动态…

SCSI/UFS储存 基础

一、UFS协议 UniPro 的上面就是 UTP 和 SCSI 命令集&#xff0c;由于涉及的 SCSI 命令是很大一块需要单独来讲&#xff0c;所以这里只简单两笔。正如最开始提到的&#xff0c;UTP 和 SCSI 是属于 SCSI 这部分&#xff0c;在 JEDEC 的标准里能找到它们的具体说明。 UTP&#xf…

仅用三张图片实现任意场景三维重建:ReconFusion

论文题目&#xff1a; ReconFusion: 3D Reconstruction with Diffusion Priors 论文作者&#xff1a; Rundi Wu, Ben Mildenhall, Philipp Henzler, Keunhong Park, Ruiqi Gao, Daniel Watson, Pratul P. Srinivasan, Dor Verbin, Jonathan T. Barron, Ben Poole, Aleksande…

Java - Lombok的添加和使用详解

目录 &#x1f436;6.1 lombok介绍 &#x1f436;6.2 lombok使用 1. &#x1f959;添加方法一 2. &#x1f959;添加方法2 3. 使用 &#x1f436;6.3 lombok常用注解 1. &#x1f959;Getter和Setter 2. &#x1f959;ToString 3. &#x1f959;NoArgsConstructor和Al…

随笔03 笔记整理

图源&#xff1a;文心一言 关于我的考研与信息安全类博文整理~&#x1f95d;&#x1f95d; 第1版&#xff1a;整理考研类博文~&#x1f9e9;&#x1f9e9; 第2版&#xff1a;提前列出博文链接&#xff0c;以便小伙伴查阅~&#x1f9e9;&#x1f9e9; 第3版&#xff1a;整理We…