express的使用(一)

news2024/11/25 8:16:50

因为有时候没有登录CSDN,所以弄了一个订阅号,会不定时的更新文章(其实就是在csdn这边发布了之后搬过去,不过有问题的可以留言,csdn不常上来看),欢迎订阅
文章链接:[订阅号-express的使用(一)]
------------------------------------------------------------------------------------

看前提示

本篇主要对于很小白的,废话很多

关于express

当使用Node.js进行开发,主要提供api服务的,轻便的,社区大,bug容易解决的,稳定的框架

基于Node.js平台,快速,开放,极简的Web开发框架

环境准备

node.js   16.15
nodemon   2.0.22
express   4.18.2

最主要的服务是express提供的,而nodemon是我们不需要每次更改代码后都重新启动一次,所以使用nodemon提供热更新~为了教学简便,不使用ts,防止增加他人学习成本

快速使用

在package中编写我们的启动指令,个人习惯用dev,所以便用dev来作为启动的指令

 "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev":"nodemon server.js"
  },

项目的入口文件,自然就是server.js了,在server.js中编写代码

const express = require("express");
const app = express();

app.get("/a", (req, res) => {
  console.log("开始调用a接口-1");
});
app.get("/a", (req, res) => {
    console.log("开始调用a接口-2");
  });
app.get("/b", (req, res) => {
  console.log("开始调用b接口");
});

app.listen(3000, () => {
  console.log("服务已启动");
});

运行结果如下,因为都是get请求,所以在浏览器中直接在地址栏中上依次输入以下的路径,即可在访问到我们的程序,也能在控制台中看到我们打印出来的日志

http://localhost:3000/a
http://localhost:3000/b

当然我这儿做了一个小测试,我们设置两个get都是请求a接口的时候,可以看到只打印了先注册的接口a-1,所以可以理解为在这种情况下,先注册的不会被后注册的代替

虽然app.listen以及app.get没有什么可讲的,但是依照惯例,对于初学者还是需要讲解下这两个。

  • app.get

express中对于指定的路径的get请求的监听

app.get(path, callback [, callback ...])

Routes HTTP GET requests to the specified path with the specified callback functions.

https://www.expressjs.com.cn/4x/api.html#express

既然监听了get请求,自然也有很常用的post/delete/put。不过就不一一测试了,相信我,后面的打工日子中,你多的是机会用到。

  • app.listen

对主机中的某个端口号进行监听

app.listen([port[, host[, backlog]]][, callback]) 

Binds and listens for connections on the specified host and port. This method is identical to Node’s http.Server.listen().

https://www.expressjs.com.cn/4x/api.html#express

路由模块

最简单的服务就这么启动了,但作为一个api服务,势必会有多个模块,不可能将全部的代码都堆在了我们的server.js中,也要提供一个路由模块,此时就需要用到express.Router了

  • 关于路由的描述

路由器对象是中间件和路由的一个独立实例。您可以将其视为一个“迷你应用程序”,只能执行中间件和路由功能。每个Express应用程序都有一个内置的应用程序路由器。路由器的行为就像中间件本身,所以你可以将其用作app.use()的参数,也可以用作另一个路由器的use()方法的参数。

顶级express对象有一个Router()方法,用于创建一个新的路由器对象。

一旦创建了路由器对象,就可以像应用程序一样向其添加中间件和HTTP方法路由(如get、put、post等)。

https://www.expressjs.com.cn/4x/api.html#router

假定现在情况是一个个人博客系统,那么我需要有一个博客模块,比如我根据id获取到博客的详情,外加一个用户模块,那么为了我们的模块能更加的清晰,就需要分别配置一个名为User以及blog的路由,分别提供这两个模块的访问,同时,用一个文件夹将两者包起来。那么,我们的项目结构会变成下面这种形式

而在其中的src/router/blog.js以及src/router/user.js则是编写我们的路由代码,举其中的user.js作为例子

const express = require("express");
const router = express.Router();

router.get("/getUserDetail", function (req, res, next) {
  console.log("获取用户的详情");
});

module.exports = {
  userRouter: router,
};

第二行中使用到了express.Router(),创建一个新的路由对象,监听了getUserDetail这个api,并将其导出去,在server.js中使用use方法进行合并(use方法在讲中间件的时候再说)

const express = require("express");const app = express();
const {blogRouter} = require("./src/router/blog");const {userRouter} = require("./src/router/user");
app.listen(3000, () => {  console.log("服务已启动");});app.use("/blog", blogRouter);
app.use("/user", userRouter);

在路由器中访问:

http://localhost:3000/user/getUserDetail

即可看到如下的效果

request与response

至此,一个最最简单,而且看起来勉强规范的express项目就理解了,但是还有一点,我们会在浏览器看到一直在转圈圈,这是因为我们没有返回到前端任何的数据,所以整个http的流程还没结束,在一个http请求中,我们需要关注的是Request以及Response。以下面的这个最简单的代码为例

router.get("/getUserDetail", function (req, res, next) {
  console.log("获取用户的详情");
});

既然提到了request 对象以及response对象,我们需要看下官网中对于这两个对象的描述

  • request对象

Request The req object represents the HTTP request and has properties for the request query string, parameters, body, HTTP headers, and so on.

根据文档,实际上就是http请求的request,那么。我们现在假定请求的链接为

http://localhost:3000/user/getUserDetail?id=1

当前的代码如下:

const express = require("express");
const router = express.Router();

router.get("/getUserDetail", function (req, res, next) {
  const { query = {}, method = "" } = req;
  console.log("req对象中的query是=========>");
  console.log(query);
  console.log("req对象中的methods是=========>");
  console.log(method);
});

module.exports = {
  userRouter: router,
};

打印出来的自然是:

这一块就没啥好说的了,对于http不怎么熟悉的。我之前的博客有相关的介绍,我觉得可以去看下。

  • response对象

Response The res object represents the HTTP response that an Express app sends when it gets an HTTP request.

根据文档,自然就是http请求中的response了,也就是我们用来返回给前端的信息。而在express的github的代码中,也有

 res.send('Hello World')

因此我们就大胆的加上去试试

router.get("/getUserDetail", function (req, res, next) {
  const { query = {}, method = "" } = req;
  console.log("req对象中的query是=========>");
  console.log(query);
  console.log("req对象中的methods是=========>");
  console.log(method);
  res.send('找不到这个用户');
});

效果图如下:

至此,最最基本的服务是完成了,也成功的返回给前端,由于这篇废话太多了,我就不继续了,五分钟的文章,是最好的。

备注

  • 请注意,这是一个后台项目,所以全程希望使用require做导入导出,你也不想项目一人用require,一人用import吧?(后续可以通过eslint来规范)

  • 文中的引用,尽可能的不改变文字,方便大家在文档中搜索

参考链接

https://github.com/expressjs/express [github-express]

https://www.expressjs.com.cn/4x/api.html#express [express4.x]

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

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

相关文章

全网首发2023全新ChatGPT3.5小程序开源源码 全新UI

源码简介: 2023全新ChatGPT3.5小程序开源源码 全新UI 全网首发 这一版本ui比较好看 回复速度也快了 小程序是java的 带后台 本来准备给你们带上接口的然后么后台是和接口连接的 我改什么内容你们前段都会显示所以全开源 自己搭建下吧,腾讯云买个国外服…

MFC基础入门

1 MFC入门 1.1 为什么学习MFC 在Windows平台上做GUI开发,MFC是一个不错的选择。 学习MFC不仅可以学习到MFC本身,而且可以学习MFC框架的设计思想。 1.2 Windows消息机制 基本概念解释 SDK:软件开发工具包(Software Development Kit)&…

『MySQL 实战 45 讲』15 - 两阶段提交、索引相关问题

日志和索引相关问题 mysql 两阶段提交问题 在两阶段提交的不同时刻,MySQL 异常重启会出现什么现象? 如果 crash 发生在时刻 A 由于此时 binlog 还没写,redo log 也还没提交,所以崩溃恢复的时候,这个事务会回滚 如果 …

数据链路层协议 ——— 以太网协议

文章目录 链路层解决的问题以太网协议认识以太网以太网帧格式认识MAC地址对比理解MAC地址和IP地址认识MTUMUT对IP协议的影响MTU对UDP协议的影响MTU对TCP协议的影响数据跨网络传输的过程 ARP协议ARP协议的作用ARP数据的格式ARP协议的工作流程 链路层解决的问题 IP拥有将数据跨网…

【前端知识】Cookie, Session,Token和JWT的发展及区别(二)

【前端知识】Cookie, Session,Token和JWT的发展及区别(二) 4. Session4.1 Session的背景及定义4.2 Session的特点👍4.2.1 Session的特点👀4.2.2 Session保存的位置 4.3 Session的一些重要/常用属性4.4 Session的认证流程4.5 Sessi…

Python数据清洗:Python和Pandas数据清洗的实用教程

前言: 技术书籍是学习技术知识的重要资源之一。读技术书可以帮助我们学习新技能和知识,技术书籍提供了可靠的、全面的信息,帮助我们快速学习新技能和知识。同时技术书籍有助于保持你的竞争力,因为它们提供了最新的技术知识和实践。…

什么? 你还没用过 Cursor? 智能 AI 代码生成工具 Cursor 安装和使用介绍

作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

ChatGPT 免费体验来了

露个相吧 1、相信很多小伙伴们面试或者工作中会遇到数组扁平化这一问题,如今正是 chatgpt 大火的时候,何不让我们试试水呢,所以让我们的 chatgpt 用js帮我们写一个数组扁平化吧 2、这就?这就?这就写出来了&#xff1f…

【JavaScript数据结构与算法】字符串类(反转字符串中的单词)

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端(Node.js) 📃个人状态: 在校大学生一枚,已拿多个前端 offer(…

【大数据基础】淘宝双11数据分析与预测

https://dblab.xmu.edu.cn/post/8116/ 问题 问题1 mysql登录需要密码 https://cloud.tencent.com/developer/beta/article/1142525 这个很神奇,我密码输1就进去了 为避免出问题,把解决方案放这里: https://blog.csdn.net/qq_34771403/ar…

【路径规划】全局路径规划算法——蚁群算法(含python实现)

文章目录 参考资料1. 简介2. 基本思想3. 算法精讲4. 算法步骤5. python实现 参考资料 路径规划与轨迹跟踪系列算法蚁群算法原理及其实现蚁群算法详解(含例程)图说蚁群算法(ACO)附源码蚁群算法Python实现 1. 简介 蚁群算法(Ant Colony Algo…

mybatis-plus 自动填充的时间跟真实时间相差8小时

项目中 用到了以下两个字段,分别是插入数据时间和更新数据时间,用的mybatis-plus自动填充,结果发现填充的时间跟真实时间相差很多。查了一些资料,找到了解决方案: 1. 下图是我的mysql没有进行配置之前的时区配置,这里的CST包括了4个时区,分别…

一百零六、Hive312的计算引擎由MapReduce(默认)改为Spark(亲测有效)

一、Hive引擎包括:默认MR、tez、spark 在低版本的hive中,只有两种计算引擎mr, tez 在高版本的hive中,有三种计算引擎mr, spark, tez 二、Hive on Spark和Spark on Hive的区别 Hive on Spark:Hive既存储元数据又负责SQL的解析&…

【0基础】学习solidity开发智能合约-初识solidity

本篇课程开始,我们来学习一下如何使用solidity开发智能合约,由于博主对于solidity的学习,也是自学的,所以一些不足或有纰漏之处还望指出,大家共同进步,本系列课程会分很多节课讲述,从入门到进阶…

安装navicat详细流程

1.双击已下载好的navicat安装包,点击"下一步" 2.点击我同意,在点击"下一步" 3.设置navicat安装路劲, 至少要保证磁盘有90M的空间。在这里选择默认的安装路径,也可以根据自身情况安装到其他盘。 4.默认&#x…

一个几乎全民都会的算法——二分查找

为什么说二分查找是全民都会的算法? 20年前央视2套有一档叫《幸运52》的综艺节目,其中一个环节叫《幸运超市》,每一期已故著名主持人咏哥都会给佳宾们出示几个商品,凡是佳宾猜中价格的,就能获赠这件商品。这档节目红极…

C++ 类和对象(中)构造函数 和 析构函数 ,const成员

上篇链接:C 类和对象(上)_chihiro1122的博客-CSDN博客 类的6个默认成员函数 我们在C当中,在写一些函数的时候,比如在栈的例子: 如上述例子,用C 返回这个栈是否为空,直接返回的话&am…

Selenium+Pytest自动化测试框架实战

前言 1、Selenium是一个免费的(开源)自动化测试组件,适用于跨不同浏览器和平台的Web应用程序【selenium是一个自动化工具,而不是自动化框架】。它非常类似于HP Quick Test Pro (QTP现在叫UFT),只是Selenium侧重于自动化基于Web的应用程序。使…

初、高中生到底该不该学习编程?

从小学,到初中,再到高中,知识的提升主要体现在一个方面上,就是知识越来越抽象了。很多孩子在初中成绩还可以,到了高中就跟不上了,这是最主要的一个原因。 编程主要就是要求学习它的人,有较强的…

2023武生院计科专升本指南

自我介绍一下,我叫啊超,22级专升本上岸武生院考了211的计应学长,社恐,不善言辞,出门都走下水道,吃饭因社恐,屡次不敢买单。单身可撩,哈哈哈~ 我只是提出自己的一些个人建议&#xff…