Node.js后端开发 - 进阶篇 #8 express框架之路由模块的封装1

2023-11-07

目录

一、前言

二、路由模块的封装

1、初始化项目、安装express框架

(1)npm init -y 初始化项目,生成package.json文件

(2)npm init -y 和 npm init 区别

(3)安装 express 框架

---生成 node_modules 文件夹 和 package-lock.json 文件

--- 执行npm install express -save 和 npm install express --no-save 的区别

2、封装路由模块

步骤1:写主模块 app.js

步骤2:写配置模块 config.js

步骤3:写路由模块 router.js


一、前言

最近每天都有三到五个粉丝的关注,不免增加我写博文的动力,这不一大早其它同事还没来,我又开始写博文了,其实写博文是非常枯燥的事情,需要毅力决心来坚持!在此感谢大家的关注和支持,同时欢迎留言共同交流进步!上一篇文章我们讲了res对象的常见方法res.json()、res.redirect()等方法的使用,详细可参考博文:Node.js后端开发 - 进阶篇 #7 express框架之res对象的常见方法 ,这篇文章我们将讲一下对路由模块的封装

二、路由模块的封装

1、初始化项目、安装express框架

(1)npm init -y 初始化项目,生成package.json文件

在 Visual Studio Code 新建文件夹 express-project(注:需要注意的是项目名称和模块名称express不要一样),然后在里面新建一个文件 app.js,打开终端执行如下命令:

npm init -y 初始化项目,它会在项目中自动生成一个package.json文件。

(2)npm init -y 和 npm init 区别

前面讲基础篇章的时候我们有讲到 npm init命令,详细可参考:Node.js后端开发 - 基础篇 #17 package.json 文件 这里的 npm init -y 和 npm init 不同的是:它省去了敲回车的步骤,直接略过所有问答,全部采用默认答案,去生成的默认的package.json

$ npm init -y
Wrote to /Users/luminal/Desktop/nodejs/express-project/package.json:

{
  "name": "express-project",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

(3)安装 express 框架

---生成 node_modules 文件夹 和 package-lock.json 文件

执行 npm install express -save 命令安装express框架,并将其保存到依赖列表中。

$ npm install express -save
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN express-project@1.0.0 No description
npm WARN express-project@1.0.0 No repository field.

+ express@4.17.1
added 50 packages from 37 contributors and audited 126 packages in 9.879s
found 0 vulnerabilities



   ╭────────────────────────────────────────────────────────────────╮
   │                                                                │
   │       New minor version of npm available! 6.9.0 → 6.12.0       │
   │   Changelog: https://github.com/npm/cli/releases/tag/v6.12.0   │
   │               Run npm install -g npm to update!                │
   │                                                                │
   ╰────────────────────────────────────────────────────────────────╯

这个时候它会在项目中生成一个 node_modules 的文件夹 和 package-lock.json 的文件

--- 执行npm install express -save 和 npm install express --no-save 的区别

如果只是临时安装 Express,不想将它添加到依赖列表中,可执行如下命令:

$ npm install express --no-save

npm 5.0+ 版本在默认情况下会将安装的模块添加到 package.json 文件中的 dependencies 列表中。对于较老的 npm 版本,你就必须指定 --save 参数。然后,照旧执行 npm install 命令即可自动安装依赖列表中所列出的所有模块。

2、封装路由模块

npm init -y 初始化项目、npm install express --save 安装express框架以后,现在我们开始正式编码

步骤1:写主模块 app.js

// app.js 模块职责:负责启动服务

//1. 加载 express 模块
var express = require('express');
//加载 config.js 模块
var config = require('./config.js');
//加载路由模块
var router = require('./router.js');

//2. 创建 app 对象
var app = express();

//3. 启动路由
// 虽然express框架注册路由,相对于以前简单了,
// 但是这个代码本身还是属于路由模块。
// router既是一个对象,也是一个函数,
// 所以可以这样调用,并传递app对象
// ---> router.js
router(app);

//4. 启动服务
app.listen(config.port, function () {
    console.log('http://localhost:'+config.port);
});

虽然express框架注册路由,相对于以前简单了,但是这个代码本身还是属于路由模块。

下面我们来新建配置模块 config.js、路由模块 router.js

步骤2:写配置模块 config.js

前面我们讲过模块化了,我们把端口号放在一个独立模块里面 config.js


// 配置模块: 主要职责是负责保存项目中的配置信息

module.exports = {
    port : 3000
};

步骤3:写路由模块 router.js

// 我们封装一个模块一般需要考虑三个问题:

//1、什么样的代码要放到这个模块当中?  代码模块化确定  

//2、这些代码是否用到外部的一些数据?  我们需要拿到app 

//3、当前这个模块对外应该暴露一些什么东西?(module.exports)?  通过一个方法

//路由模块:主要负责路由判断

// 把router作为函数返回暴露出来
// 这样传递app主对象,暴露了app主对象,这样做不安全
module.exports = function (app) {
    app.get('/', function (req, res) {
        console.log("当前根目录");
    });  

    app.get('/index', function (req, res) {
        console.log("index");
    });  

};

虽然这么写可以实现功能,但是express不推荐这么写!原因是这样传递app主对象,暴露了app主对象,这样做不安全。我们使用router.js 是为了注册一些路由,但是这样把主对象app给传递暴露出来了。假如主对象里面有停止服务的方法 stopServer,在router.js 里面是能调用到的,这样做肯定不安全!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js后端开发 - 进阶篇 #8 express框架之路由模块的封装1 的相关文章

随机推荐

  • 协同过滤推荐算法实例代码

    什么是协同过滤 协同过滤是利用集体智慧的一个典型方法 要理解什么是协同过滤 Collaborative Filtering 简称 CF 首先想一个简单的问题 如果你现在想看个电影 但你不知道具体看哪部 你会怎么做 大部分的人会问问周围的朋友
  • 【自然语言处理】条件随机场【Ⅳ】条件随机场学习问题

    有任何的书写错误 排版错误 概念错误等 希望大家包含指正 部分推导和定义相关的佐证资料比较少 供参考 讨论的过程中我会加入自己的理解 难免存在错误 欢迎大家讨论 在阅读本篇之前建议先学习 隐马尔可夫模型系列 最大熵马尔可夫模型 由于字数限制
  • LR 录制Web(HTTP/HTML)脚本的模式选择

    LR 录制Web HTTP HTML 脚本的模式选择 Loadrunner进行Web HTTP HTML 协议录制时有两种录制模式 HTML basescript和URL base script 两种模式在录制的脚本和统计数据上具有较大的差
  • Linux QtCreator 编译报错:No rule to make target '.../***' needed by '***.o'.stop

    Linux QtCreator 编译报错 No rule to make target mainwindow cpp needed by mainwindow o stop 1 解决方案 1 打开工程项目的pro文件 2 搜索找到mainw
  • for循环执行次数_VB学习笔记 之循环控制结构部分

    VB编程控制结构 在VB编程中提供了3种控制结构 分别是 顺序结构 选择结构 循环结构 其中顺序结构非常容易理解 即按照代码的先后顺序依次执行 重点和难点内容在于选择结构和循环结构 其中循环结构又有3种不同风格 分别是For 计数 循环 W
  • 栈实现综合计算器(中缀表达式)

    栈实现综合计算器 中缀表达式 来自专栏 LeetCode基础算法题 欢迎订阅 文章目录 栈实现综合计算器 中缀表达式 1 题目 2 思路 3 代码 4 总结 1 题目 使用栈来实现综合计算器 2 思路 看到计算器我们首先想到的数据结构是栈
  • pycharm-使用wsl

    pycharm使用wsl 更换terminal 在设置里面搜索terminal 将cmd exe改为bash exe
  • Excel VBA判断最后一行/列

    判断到哪里结束应该是Excel VBA最常见的操作之一 下面代码能实现这个功能 Function LastColumn As Long Dim ix As Long ix ActiveSheet UsedRange Column 1 Act
  • 记一次pptp实践经历

    由于公司业务需求 需要搭建vpn服务器以供外部用户传送数据 所以需要采用客户端到网关的方式的VPN VPN服务器的类型很多 如IPSec L2TP PPTP SSLVPN OPENVPN等 考虑到安全稳定性的因素 专业的vpn设备肯定是首要
  • casual discovery Toolbox使用(R语言做因果分析)

    casual discovery Toolbox使用 cdt casual discovery Toolbox 是一个用于因果关系发现的开源工具包 里面包括10多个算法 其中一些是用R语言开发的所以需要安装R的一些东西 1 安装R和RStu
  • 黑客工具Armitage

    Armitage介绍 Armitage是一款Java写的Metasploit图形界面化的攻击软件 可以用它结合 Metasploit中已知的exploit来针对主机存在的漏洞自动化攻击 通过命令行的方式使用Metasploit难度较高 需要
  • Git——Day2(使用git管理远程仓库)

    1 使用远程仓库目的 作用 备份 实现代码共享集中化处理 2 如何将本地仓库同步到git远程仓库 命令 git push 将本地提交到远程 步骤1 工作区 Work Directory 暂存区 步骤2 暂存区 提交到git仓库 Git Re
  • Unity InputField 拉起手机系统键盘

    inputField ActivateInputField ActivateInputField将自动拉起键盘 隐藏移动设备上屏幕键盘附带的文本输入显示区 白色区域 仅适用于iOS设备生效 inputField shouldHideMobi
  • 多线程总结

    一 多线程 1 什么是进程 什么是线程 进程是一个应用程序 1个进程是一个软件 线程是一个进程中的执行场景 执行单元 一个进程可以启动多个线程 对于java程序来说 当在DOS命令窗口中输入 java HelloWorld 回车之后 会先启
  • GBDT算法详解

    GBDT基本思想 GBDT的基本结构是决策树组成的森林 学习方式是梯度提升 具体的讲 GBDT作为集成模型 预测的方式是把所有子树的结果加起来 GBDT通过逐一生成决策子树的方式生成整个森林 生成新子树的过程是利用样本标签值与当前树林预测值
  • dp(动态规划)思考

    dp的核心思想是分治策略和表存储 分治策略并非dp所独有 很多算法都运用了把问题拆解为子问题的做法 比如递归 表存储应该是dp比较独有的一种方式 通过存储一些中间结果 可以避免重复计算 从而提升程序运行的速度 def max length
  • 简述3032路pcm帧的结构_基于5G NSA组网结构下用户体验提升研究

    摘要 针对现阶段5G NSA组网结构模式下 开展5G特性研究 以研究5G新一代通信技术与5G相关技术特点为前提 结合实际测试与分析结果 通过对DC双连接 时隙配比以及MASSIVE MIMO差异性3个方面进行分析测试对比 大幅度提升NSA组
  • UnityWebRequest向后端Get数据,后端显示 code 400, message Bad request version 和 HTTPStatus.BAD_REQUEST

    结论 我遇到这个问题是因为UnityWebRequest Get url 中的url是 https localhost port 但是用python flask写的后端服务器url却是 http localhost port 当我把Unit
  • JDBC(二)

    DatabaseMetaData 接口 通过这个接口中的方法可以查看数据库的整体综合信息 DatabaseMetaData 给出的信息描述 DBMS 所提供的事务支持水平 比如 查看驱动程序 数据库 的版本号等 boolean suppor
  • Node.js后端开发 - 进阶篇 #8 express框架之路由模块的封装1

    目录 一 前言 二 路由模块的封装 1 初始化项目 安装express框架 1 npm init y 初始化项目 生成package json文件 2 npm init y 和 npm init 区别 3 安装 express 框架 生成