nodejs篇 express(1)

文章目录

    • 前言
    • express介绍
    • 安装
    • RESTful接口规范
    • express的简单使用
      • 一个最简单的服务器,仅仅只需要几行代码便可以实现。
      • restful规范的五种接口类型
      • 请求信息req的获取
      • 响应信息res的设置
      • 中间件的使用
      • 自定义中间件
      • 解决跨域
    • nodejs相关其它内容

前言

express作为nodejs必学的模块之一,从这篇文章开始,介绍express一些基础内容,express的安装,restful接口规范,express的接口开发,express的跨域处理,express的中间件使用,请求信息req常见处理,请求头res常见处理等。为接下来真正的项目框架下开发一个express服务器做准备。

express介绍

express是在nodejs内置模块http的基础上开发,也就是说http模块有的api,express全都有,并且它们的用法也很类似。

express.js的优点在于,它封装了一些常用的,接口处理方法,更有利于中间件的扩展,让接口的开发更加规范合理等。

安装

express不是nodejs的内置模块,属于第三方开源模块,想要使用需要下载安装。

将来要部署到服务器,在开发环境和生产环境都需要使用,输入命令行

npm install express --save 或者 yarn add express

在开发过程中,会发现,我们一直在编写服务端的代码,每次修改后,都需要关掉原来的服务器,重启 node express.js才能生效。

为此,再安装一个辅助npm包nodemon,nodemon能自动监听文件的更新,并自动重启。

npm install -g nodemon 或者 yarn global add nodemon 

安装好了之后,我们重启一下服务器,就再也不需要每次更改代码后都要重启了

nodemon express.js

RESTful接口规范

既然要开发服务器,我们就要遵循接口开发规范,这里简单介绍RESTful接口设计规范。

  1. 尽量使用https协议,如果条件不支持,就只能http协议
  2. 应该尽量将所有的api都放在专有域名之下,比如https://api.dengxi.com,当然,如果你的接口比较简单,业务也不复杂,你就可以 主域名 + '/api',比如网站的域名为http://dxyx-together.cn,那所有的api都放在http://dxyx-together.cn/api/xxx,后面的xxx就是api具体的path。
  3. 版本号,如果是专有域名 https://api.dengxi.com,当前版本为v1,那对应的就是https://api.dengxi.com/v1,如果不是专有域名,就将版本信息放在响应头中,这样可能不如直接放在url上直观。
  4. 路径名称,又称为终点endpoint,命名要求不允许出现英文的动词,而应该是名词复数。比如有一个接口返回许多用户的信息,就应该设计为xxx/api/users。如果返回的数据直接就是某个数据库表格的内容,那就直接以数据库表格名称命名即可。
  5. 常用的有五种接口get(获取数据),post(创建数据),delete(删除数据),put(完整更新数据),patch(某一数据部分更新),不常用的有两种(head,options),很多时候这几种接口类型可以混用,但按照规范,它们有属于自己的使用场景。
  6. 身份认证。部分接口涉及账户信息,比如常见的中后台管理系统,c端也有购物车、会员中心、钱包等场景,基于JWT的接口权限认证。
  7. 跨域处理,在服务端设置cors跨域处理,允许客户端跨域请求资源,特别是当接口放在专有域名下时。
  8. 每一个接口的每一次请求,服务器都必须给予http状态码回应和数据两个部分。
  9. http状态码分为五类 1xx(相关信息) 2xx(操作成功) 3xx(重定向) 4xx(客户端错误) 5xx(服务器错误)一共有一百多种状态码,常用的也就二十多种。
  10. 返回的数据部分,通常是JSON对象,因此,服务器返回头需要将Content-Type属性设置为application/json
  11. 错误处理主要是需要正确使用http状态码,主要是4xx和5xx,并且返回的信息尽可能详尽,以便更快速的排查。

express的简单使用

一个最简单的服务器,仅仅只需要几行代码便可以实现。

//express.js
var express = require("express");
var app = express();
var port = 3000;

app.get("/", function (req, res) {
  res.send("hello world");
});

app.listen(port, function () {
  console.log("server runing at 3000");
});

再输入命令行,服务器就成功启动

nodemon express.js

restful规范的五种接口类型

var express = require("express");
var app = express();
var port = 3000;

app.get("/", function (req, res) {
  var query = req.query
  console.log(query)
  res.send("hello world");
});

app.post("/", function (req, res) {
  res.send("post hello world");
});

app.put("/users",function(req,res) {
    res.send("put hello world");
})

app.delete("/users",function(req,res) {
    res.send("delete hello world");
})

app.patch("/users",function(req,res) {
    res.send("delete hello world");
})

app.listen(port, function () {
  console.log("server runing at 3000");
});

请求信息req的获取

比如我们获取get请求的参数 req.query

//express.js
var express = require("express");
var app = express();
var port = 3000;

app.get("/api", function (req, res) {
  console.log(req.query)
  res.status('200')
});

app.listen(port, function () {
  console.log("server runing at 3000");
});

在这里插入图片描述
在这里插入图片描述
关于req的所有属性和方法,你可以在这里找到

http://expressjs.com/en/5x/api.html#req

中文版本的
http://expressjs.com/zh-cn/4x/api.html#req

响应信息res的设置

var express = require("express");
var app = express();
var port = 3000;

app.get("/api", function (req, res) {
  var query = req.query
  console.log(query)
  res.set('Content-Type', 'application/json')
  res.status('200')
  res.json({code:200,data: '请求成功了'})
});

app.listen(port, function () {
  console.log("server runing at 3000");
});

在这里插入图片描述
在这里插入图片描述
关于res的所有属性和方法,你可以在这里找到
http://expressjs.com/en/5x/api.html#res

中文版本
http://expressjs.com/zh-cn/4x/api.html#res

中间件的使用

express官方提供了几个比较重要的中间件
http://expressjs.com/en/5x/api.html#express

比如express.json() ,当客户端发送的数据是json数据时,req.body是取不到正常的数据的,所以,我们需要通过这个中间件处理一下才可以。

我用http模块,来请求一下我express服务器

const http = require("http");

// 请求刚刚创建的服务器
const options = {
  hostname: "localhost",
  port: 3000,
  path: "/api",
  method: "post",
  headers: {
    "Content-Type": "application/json",
  },
};

const req = http.request(options, (res) => {
  console.log(`状态码: ${res.statusCode}`);
  console.log(`响应头: ${JSON.stringify(res.headers)}`);
  res.setEncoding("utf8");
  res.on("data", (chunk) => {
    console.log(`响应主体: ${chunk}`);
  });
  res.on("end", () => {
    console.log("响应中已无数据。");
  });
});
req.write(JSON.stringify({ name: "dx" })) // 发送了一个json数据
req.end();

通过app.use 来调用中间件,达到全局使用的目的

var express = require("express");
var app = express();
var port = 3000;

app.use(express.json())

app.post("/api", function (req, res) {
  console.log(req.body)
  res.set('Content-Type', 'application/json')
  res.status('200')
  res.json({code:200,data: '请求成功了'})
});

app.listen(port, function () {
  console.log("server runing at 3000");
});

在这里插入图片描述
也可以在某个接口中单独使用中间件,只对这一个接口生效。

var express = require("express");
var app = express();
var port = 3000;

// app.use(express.json())

app.post("/api", express.json(), function (req, res) {
  // var query = req.query
  console.log(req.body)
  res.set('Content-Type', 'application/json')
  res.status('200')
  res.json({code:200,data: '请求成功了'})
});

app.listen(port, function () {
  console.log("server runing at 3000");
});

自定义中间件

中间件的本质,其实就是一个函数,express的中间件函数呢,有三个参数,req,res,next

创造一个中间件,用来打印日志,让每一次客户端请求的body都能在日志中看到,用来简化之前的方案。

function (req, res, next) {
  console.log(req.body);
  // 执行下一个中间件,必须调用,否则请求会被拦截在这里
  next();
}

再创造一个中间件,用来满足响应,总是返回status 200 并且返回相同的json

function (req, res, next) {
  res.set("Content-Type", "application/json");
  res.status("200");
  res.json({ code: 200, data: "请求成功了" });
  // 执行下一个中间件,必须调用,否则请求会被拦截在这里
  next();
}

使用这两个中间件

var express = require("express");
var app = express();
var port = 3000;

app.use(express.json());

app.use(function (req, res, next) {
  console.log(req.body);
  next();
});

app.use(function (req, res, next) {
  res.set("Content-Type", "application/json");
  res.status("200");
  res.json({ code: 200, data: "请求成功了" });

  next();
});
// app.post 里面啥也没干
app.post("/api", express.json(), function (req, res) {
});

app.listen(port, function () {
  console.log("server runing at 3000");
});

左边是服务器接口,打印了客户端传过来的name:dx,右边是客户端请求,同样拿到了状态码200和json数据。
在这里插入图片描述

中间件的执行顺序就是从上往下依次执行,执行的顺序也很重要。
如果是某一个单独的接口的中间件,中间件1比中间件2先执行性。

app.post("/api", 中间件1, 中间件2, function (req, res) {
});

解决跨域

一 用一种粗暴的方式,任意域名都能成功请求。

var express = require("express");
var app = express();
var port = 3000;

//设置允许跨域访问该服务.
app.all("*", function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*"); // *表示所有域名,你也可以指定某个特别的域名 "www.dxyx-together.cn"
  res.header("Access-Control-Allow-Headers", "Content-Type");
  res.header("Access-Control-Allow-Methods", "*"); // *表示所有请求方式都可以跨域,你也可以设置 比如只允许get和post "GET;POST"
  res.header("Content-Type", "application/json;charset=utf-8"); 
  next();
});

app.use(express.json());

app.use(function (req, res, next) {
  console.log(req.body);
  next();
});

app.use(function (req, res, next) {
  res.set("Content-Type", "application/json");
  res.status("200");
  res.json({ code: 200, data: "请求成功了" });

  next();
});

app.post("/api", express.json(), function (req, res) {});

app.listen(port, function () {
  console.log("server runing at 3000");
});

二 express 的 cors跨域
cors 是 Express 的一个第三方中间件,通过安装和配置 cors 中间件,可以很方便地解决跨域问题
使用步骤分为三步

  1. 运行 npm install cors 安装中间件
  2. 使用 const cors = require('cors') 导入中间件
  3. 在路由之前调用 app.use(cors()) 配置中间件
var express = require("express");
var cors = require('cors')
var app = express();
var port = 3000;

//设置允许跨域访问该服务.
app.use(cors())

app.use(express.json());

app.use(function (req, res, next) {
  console.log(req.body);
  next();
});

app.use(function (req, res, next) {
  res.set("Content-Type", "application/json");
  res.status("200");
  res.json({ code: 200, data: "请求成功了" });

  next();
});

app.post("/api", express.json(), function (req, res) {});

app.listen(port, function () {
  console.log("server runing at 3000");
});

cors的更多使用方式,详见cors插件官方介绍
https://www.npmjs.com/package/cors

nodejs相关其它内容

nodejs commonjs介绍
nodejs fs模块介绍
nodejs path模块介绍
nodejs events模块介绍
nodejs http模块介绍
nodejs net模块介绍
nodejs url模块介绍
nodejs process模块介绍
nodejs buffer模块介绍
nodejs stream 模块介绍

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

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

相关文章

前缀树(字典树/Trie) -----Java实现

目录 一.前缀树 1.什么是前缀树 2.前缀树的举例 二.前缀树的实现 1.前缀树的数据结构 1.插入字符串 2.查找字符串 3.查找前缀 三.词典中最长的单词 1.题目描述 2.问题分析 3.代码实现 一.前缀树 1.什么是前缀树 字典树(Trie树)是一种树形…

机器学习——无监督学习

机器学习的分类一般分为下面几种类别:监督学习( supervised Learning )无监督学习( Unsupervised Learning )强化学习( Reinforcement Learning,增强学习)半监督学习( Semi-supervised Learning )深度学习(Deep Learning)Python Scikit-learn. http: // …

用Pytorch构建一个喵咪识别模型

本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 目录 一、前言 二、问题阐述及理论流程 2.1问题阐述 2.2猫咪图片识别原理 三、用PyTorch 实现 3.1PyTorch介绍 3.2PyTorch 构建模型的五要素 3.3PyTorch 实现的步骤 3.3.…

app自动化测试——app自动化控制、常见控件定位方法

文章目录一、app自动化控制1、清理数据:2、启动:3、关闭:二、常见控件定位方法1、android知识2、ios 基础知识3、元素定位4、控件基础知识5、app dom 结构解析6、iOS 与 Android dom 结构的区别7、定位方法测试步骤三要素定位方式&#xff1a…

大环境不好,找工作太难?三面阿里,幸好做足了准备,已拿offer

三面大概九十分钟,问的东西很全面,需要做充足准备,就是除了概念以外问的有点懵逼了(呜呜呜)。回来之后把这些题目做了一个分类并整理出答案(强迫症的我狂补知识)分为软件测试基础、Python自动化…

超专业解析!10分钟带你搞懂Linux中直接I/O原理

我们先看一张图: 这张图大体上描述了 Linux 系统上,应用程序对磁盘上的文件进行读写时,从上到下经历了哪些事情。 这篇文章就以这张图为基础,介绍 Linux 在 I/O 上做了哪些事情。 文件系统 什么是文件系统 文件系统&#xff0…

docker版jxTMS使用指南:数据查询

本文讲解docker版jxTMS的数据查询,整个系列的文章请查看:docker版jxTMS使用指南 请按前文所述先做好相关的准备工作,然后多在helloWorld界面输入各种数据后点【点我】按钮,以多创建点数据来为查询做下准备。 分页查询 首先在we…

python网上选课系统django-PyCharm

学生选课信息管理系统,可以有效的对学生选课信息、学生个人信息、教师个人信息等等进行管理。 开发语言:Python 框架:django Python版本:python3.7.7 数据库:mysql 数据库工具:Navicat11 开发软件&#x…

RK3588平台开发系列讲解(NPU篇)NPU调试方法

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、日志等级二、NPU 支持查询设置项沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们一起来看一下NPU的调试方法。 一、日志等级 NPU 的运行库会根据开发板上的系统环境变量输出一些日志信息或者生成…

操作系统(2.4.5)--管程机制

1.管程的定义 利用共享数据结构抽象地表示系统中的共享资源,而把对该共享数据结构实施的操作定义为一组过程进程对共享资源的申请、释放和其它操作,都是通过这组过程对共享数据结构的操作来实现的,这组过程还可以根据资源的情况,或…

yolov8训练筷子点数数据集

序言 yolov8发布这么久了,一直没有机会尝试一下,今天用之前自己制作的筷子点数数据集进行训练,并且记录一下使用过程以及一些常见的操作方式,供以后翻阅。 一、环境准备 yolov8的训练相对于之前的yolov5简单了很多,…

【链表OJ题(九)】环形链表延伸问题以及相关OJ题

环形链表OJ题 1. 环形链表 链接:141. 环形链表 描述: 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环&…

简单分析Linux内核基础篇——initcall

写过Linux驱动的人都知道module_init宏,因为它声明了一个驱动的入口函数。 除了module_init宏,你会发现在Linux内核中有许多的驱动并没有使用module_init宏来声明入口函数,而是看到了许多诸如以下的声明: static int __init qco…

Java之类与对象(图文结合)

目录 一、面向对象的初步认知 1、什么是面向对象 2、面向对象与面向过程 二、类定义和使用 1、简单认识类 2、类的定义格式 3、练习 (1)定义一个狗类 (2)定义一个学生类 三、类的实例化 1、什么是实例化 2、类和对象的…

CSDN 周赛38期题解

CSDN 周赛38期题解1、题目名称:代写匿名信2、题目名称:寻因找祖3、题目名称:小Q新式棋盘4、题目名称:拯救公主结束语1、题目名称:代写匿名信 小Q想要匿名举报XX领导不务正业! 小Q害怕别人认出他的字迹。 他…

【数据结构】Java实现双向链表

目录 1. 接口的实现 2. 动手实现双链表 2.1 重写SeqList接口方法 2.2 在当前链表尾部添加节点(尾插) 2.3 在当前链表头部添加节点(头插) 2.4 检验index是否合法 2.5 在 第index位置添加节点(任意位置) 2.6 …

【精品】华为认证数通HCIA+HCIP题库分享(含答案解析)

嗨~大家好久不见,我是薄荷学姐,随着华为业务也全球领域的迅猛发展,越来越多人开始重视华为认证的重要性。今天给大家分享一下去年8月份的题库,基本都是一样,希望可以帮助到大家哈想要通过华为认证,除了进行…

gdb调试工具和makemakefile工具

gdb调试工具和make/makefile工具 文章目录gdb调试工具和make/makefile工具一、gdb调试工具1.debug/release2.使用二、make/makefile1.什么是make/makefile2.编写一、gdb调试工具 1.debug/release 程序有两种默认的发布方式debug和release。release是无法进行调试的。Linux中g…

Bing+ChatGPT 对传统搜索引擎的降维打击

早些时候申请了新版 Bing 的内测资格,终于收到了通过的邮件。 一天的体验之后,我的感受是:当新版 Bing 具备了 ChatGPT 的聊天能力之后,它的能力不论是对传统搜索引擎,还是 ChatGPT 自身,都将是降维打击。 …

菜鸟刷题Day3

⭐作者:别动我的饭 ⭐专栏:菜鸟刷题 ⭐标语:悟已往之不谏,知来者之可追 一.字符串压缩:面试题 01.06. 字符串压缩 - 力扣(LeetCode) 描述 字符串压缩。利用字符重复出现的次数,编…