从0到1利用express搭建后端服务

目录

  • 1 架构的选择
  • 2 环境搭建
  • 3 安装express
  • 4 创建启动文件
  • 5 express的核心功能
  • 6 加入日志记录功能
  • 7 日志记录的好处
  • 本节代码
  • 总结

不知不觉学习低代码已经进入第四个年头了,既然低代码很好,为什么突然又自己架构起后端了呢?我有一句话叫低代码不够,代码来凑。

低代码现在看来也并不是21出现的时候打的旗号是人人都是开发者,效率高的不行。目前看,发展的道路是曲折的,想依靠低代码一比一实现代码实现的项目还是比较困难的。

困难是暂时的,办法总是要有的,那就有了自己架构后端能力的想法。

1 架构的选择

就像我们做饭一样,先要看菜谱,然后才是选购食材,然后才是按照方法练习。后端架构也是一样,选择什么技术路线,选用什么样的组件,怎么一步步的实现功能。

我们这次后端的架构是选用的express,为啥要选他?因为学习低码的过程你是不得不把Js完整学下来的,既然js已经很熟练了,那么选择一样的技术栈里的技术就省了不少劲。

再者express属于轻量级的后端框架,不需要学习过多的技术概念,马上就可以实践。

2 环境搭建

express要求你先安装好nodejs,我这里选择安装20版本,保持最新就可以,我们学习么,学点新的东西。

nodej安装比较简单,从官网下载安装包下一步安装就行,安装完了,用命令验证一下

node -v
npm -v

在这里插入图片描述
然后需要在我们的硬盘的盘符里创建一个工程目录,比如我这里创建在D盘下的code目录下的expressbackend
在这里插入图片描述
在当前目录的地址栏,我们输入cmd就快捷的打开了命令行窗口
在这里插入图片描述
在命令行窗口里输入npm初始化的命令

npm init

在这里插入图片描述
一路回车,到最终结果,文件夹会多出一个package.json文件,注意的是有个地方是选入口文件,我们的nodejs通常命名为app.js,注意这里要改一下
在这里插入图片描述
在这里插入图片描述

3 安装express

要用express开发,先需要引入框架,在我们的工程目录,在cmd里输入

npm install express

在这里插入图片描述
库安装好之后会生成一个node_moodules文件夹,里边放着我们引用的第三方的库
在这里插入图片描述

4 创建启动文件

库安装好之后,就可以创建启动文件了,在工程目录创建一个app.js
在这里插入图片描述
框架搭建好之后我们就可以开始写代码了,一般是使用IDE去写,打开我们的vscode,选择open folder打开我们的工程目录
在这里插入图片描述
在这里插入图片描述
要使用库先需要引入,通过require语句引入库,然后再启动服务,输入如下代码

const express = require('express')
const app = express()

app.get('/',(req,res)=>{
    res.send('hello,world')
})

const PORT = 3000

app.listen(PORT,()=>{
    console.log(`express start in ${PORT}`)
})

然后在vscode里新建一个terminal,输入启动命令
在这里插入图片描述

node app.js

控制台打印了服务已经在3000端口启动,打开浏览器输入http://localhost:3000,看到hello,world表示服务已经启动成功
在这里插入图片描述

5 express的核心功能

express提供了路由和中间件核心功能,路由是让我们可以按照不同的路径来调用不同的后端服务,比如我们可以访问/auth/login来实现用户的登录,访问/auth/signUp实现注册用户。

而中间件可以拦截请求进行各种校验,比如我们可以加入日志功能,记录我们的请求日志,加入token验证功能来验证token是否过期,加入跨域验证来解决跨域访问的问题

为了代码清晰,我们将中间件和路由分别拆分到不同的文件夹里,可以在根目录创建middleware表示中间件,创建routes表示路由

在这里插入图片描述

6 加入日志记录功能

在中间件里我们先加入日志记录功能,让每次访问接口的时候都能记录下请求信息,在middleware文件夹下创建logger.js
在这里插入图片描述
现在的terminal已经用来启动服务了,我们再创建一个terminal用来安装日志的包morgan
在这里插入图片描述

npm install morgan

然后输入如下代码

const morgan = require('morgan');  
const fs = require('fs');  
const path = require('path');  
  
// 创建日志文件的路径  
const logFile = path.join(__dirname, '..', 'access.log');  
  
// 创建一个可写流,用于将日志写入文件  
const accessLogStream = fs.createWriteStream(logFile, { flags: 'a' });  
  
// 配置morgan,使用自定义的日志格式,并将日志输出到文件  
const logFormat = ':remote-addr - :date[iso] ":method :url HTTP/:http-version" :status :res[content-length] - :response-time ms'
const logger = morgan(logFormat, { stream: accessLogStream });  
  
module.exports = logger;

这段代码的意思是在根目录创建一个access.log,然后每次请求都追加进来

日志文件弄好之后,就需要在app.js里引入日志中间件,在app.js加入如下代码

const logger = require('./middleware/logger');
app.use(logger)

加入之后重新启动服务,然后再次在浏览器里访问http://localhost:3000
在这里插入图片描述
就可以看到根目录下多了一个access.log并且文件里记录了我们请求的信息

7 日志记录的好处

我们通过记录用户的访问日志,也可以从侧面了解应用的运行情况,如果其中大量出现服务报错或者频繁访问的情况,就可以初步判定系统正在遭受攻击,也可以有效的应对。

再一个就是如果用户访问接口总是报错,有可能有潜在的问题,也是诊断线上故障的一个辅助手段,可以记录用户实际的一个路径。

本节代码

app.js

const express = require('express')
const app = express()
const logger = require('./middleware/logger');
app.use(logger)
app.get('/',(req,res)=>{
    res.send('hello,world')
})

const PORT = 3000

app.listen(PORT,()=>{
    console.log(`express start in ${PORT}`)
})

logger.js

const morgan = require('morgan');  
const fs = require('fs');  
const path = require('path');  
  
// 创建日志文件的路径  
const logFile = path.join(__dirname, '..', 'access.log');  
  
// 创建一个可写流,用于将日志写入文件  
const accessLogStream = fs.createWriteStream(logFile, { flags: 'a' });  
  
// 配置morgan,使用自定义的日志格式,并将日志输出到文件  
const logFormat = ':remote-addr - :date[iso] ":method :url HTTP/:http-version" :status :res[content-length] - :response-time ms'
const logger = morgan(logFormat, { stream: accessLogStream });  
  
module.exports = logger;

总结

我们本篇讲解了express的搭建和启动过程,演示了一个日志记录功能的搭建流程,后续还会介绍其他中间件已经路由的搭建过程,敬请期待。

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

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

相关文章

C++——vector类及其模拟实现

前言:前边我们进行的string类的方法及其模拟实现的讲解。这篇文章将继续进行C的另一个常用类——vector。 一.什么是vector vector和string一样,隶属于C中STL标准模板库中的一个自定义数据类型,实际上就是线性表。两者之间有着很多相似&…

安装docker 并搭建出一颗爱心树

1、docker介绍 Docker 是⼀个开源的容器运⾏时软件(容器运⾏时是负责运⾏容器的软件),基于 Go 语 ⾔编写,并遵从 Apache2.0 协议开源。 Docker可以让开发者打包⾃⼰的应⽤以及依赖到⼀个轻量的容器中,然后发布到任何…

Python 垃圾回收和弱引用(Weakref)

Python中的赋值语句是建立变量名与对象的引用关系,多个变量可以引用同一个对象,当对象的引用数归零时,可能会被当作垃圾回收。而弱引用即可以引用对象,又不会阻止对象被当作垃圾回收,因此这个特性非常适合用在缓存场景…

值得收藏!2024年人工智能顶级会议投稿信息汇总(计算机视觉领域)

计算机视觉是人工智能领域的重要分支。它融合了图像处理、模式识别、机器学习和人工智能等多个领域的技术,旨在让计算机具备类似甚至超越人类视觉系统的能力。本文将精选介绍计算机视觉领域内的重要会议,包括会议主题、稿件提交的截止日期、会议的时间与…

SpringCloudConfig 使用git搭建配置中心

一 SpringCloudConfig 配置搭建步骤 1.引入 依赖pom文件 引入 spring-cloud-config-server 是因为已经配置了注册中心 <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</…

【软件安装】(十四)Ubuntu22.04安装Psensor硬件监视器

一个愿意伫立在巨人肩膀上的农民...... Ubuntu系统硬件运行查询输入指令太繁琐&#xff0c;终端展示不直观&#xff0c;因此这款具有可视化监控Ubuntu系统下当前电脑的硬件CPU&#xff08;中央处理器&#xff09;、GPU&#xff08;显卡&#xff09;和硬盘等温度等功能&#xff…

2024年妈妈杯数学建模思路B题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

MySQL进阶——锁

锁 概述 全局锁 表级锁 行级锁 概述 同Java中的锁。目的是为了保证数据一致性、完整性&#xff0c;提高并发安全、控制访问顺序。 分类 在MySQL中&#xff0c;根据锁的粒度分&#xff0c;分为以下3种&#xff1a; 全局锁&#xff1a;锁定数据库种的所有表 表级锁&#…

『大模型笔记』提示工程、微调和RAG之间对比

提示工程、微调和RAG之间对比 文章目录 一. 提示工程、微调和RAG之间对比二. 参考文章文章:Prompt Engineering vs Finetuning vs RAG一. 提示工程、微调和RAG之间对比 Prompt EngineeringFinetuning

截图识别对比:CnOCR与PaddleOCR

1、需求 想使用PyAutoGUI做界面自动化&#xff0c;需要一个ocr库识别压测软件的文字&#xff0c;然后获取定位。现在找到了CnOCR与PaddleOCR&#xff0c;都安装来试试看&#xff0c;哪一个更适合我的需求&#xff0c;这里对这俩库进行对比。 本机环境&#xff1a; win11python…

说说HTTP 常见的状态码有哪些,适用场景?

一、是什么 HTTP状态码&#xff08;英语&#xff1a;HTTP Status Code&#xff09;&#xff0c;用以表示网页服务器超文本传输协议响应状态的3位数字代码 它由 RFC 2616规范定义的&#xff0c;并得到 RFC 2518、RFC 2817、RFC 2295、RFC 2774与 RFC 4918等规范扩展 简单来讲…

【C++】 vector 数组/向量

文章目录 【 1. vector 的声明与初始化 】1.1 vector 的声明1.2 vector 的初始化1.2.1 构造一个空的 vector1.2.2 指定数量初值的方式初始化 vector1.2.3 迭代器的方式初始化1.2.4 构造一个相同的 vector 【 2. vector 的相关操作 】2.1 插入元素2.1.1 在vector的末尾插入新元素…

Docker搭建FastDFS + Ngnix图片文件服务器

安装教程 一、环境与备件安装&#xff08;安装Docker&#xff09; 更新系统&#xff1a;首先&#xff0c;确保系统已更新到最新版本。 a. 更新Ubuntu系统命令&#xff1a; sudo apt update sudo apt upgradeb. 更新CentOS系统命令&#xff1a; sudo yum update安装依赖项&…

GESP Python编程二级认证真题 2024年3月

Python 二级 2024 年 03 月 1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 小杨的父母最近刚刚给他买了一块华为手表&#xff0c;他说手表上跑的是鸿蒙&#xff0c;这个鸿蒙是&#xff1f;&#xff08; &#xff09; A. 小程序 B. 计时器 C. 操作系统…

重磅:2024中国国际信息通信展览|通信展览会

2024中国国际信息通信展览|通信展览会 让我们一起怀揣激情与期待&#xff0c;相聚2024中国信息通信展&#xff01;这场盛大的展览将于9月25日-27日在北京.国家会议中心隆重举行&#xff0c;展会向世界展示中国信息通信行业在工信部“十四五”规划中迎来的新时代。 2024年中国…

数据结构刷题篇 之 【力扣二叉树基础OJ】详细讲解(含每道题链接及递归图解)

有没有一起拼用银行卡的&#xff0c;取钱的时候我用&#xff0c;存钱的时候你用 1、相同的树 难度等级&#xff1a;⭐ 直达链接&#xff1a;相同的树 2、单值二叉树 难度等级&#xff1a;⭐ 直达链接&#xff1a;单值二叉树 3、对称二叉树 难度等级&#xff1a;⭐⭐ 直达…

NFT Insider #125:Astar将与索尼开发的新公链将关注游戏或 NFT 等众多领域

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members &#xff08;https://twitter.com/WHALEMembers&#xff09;、BeepCrypto &#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜…

【C语言】——指针六:冒泡排序与qsort函数的实现

【C语言】——指针六&#xff1a;冒泡排序与qsort函数 一、冒泡排序1.1、冒泡排序的原理1.2、用代码实现冒泡排序 二、qsort函数2.1、qsort函数的定义2.2、 qosrt函数的使用&#xff08;1&#xff09;比较函数的写法&#xff08;2&#xff09;使用 q s o r t qsort qsort 函数…

Linux 常用命令(1)

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;Linux 随笔集合 …

NetCore3.1 Controller中直接返回JObject对象抛出异常解决方案

问题描述 在NetCore 3.1的Web项目中&#xff0c;Controller有一个方法直接返回JObject对象时&#xff0c;抛出了异常 S y s t e m . N o t S u p p o r t e d E x c e p t i o n : T h e c o l l e c t i o n t y p e ′ N e w t o n s o f t . J s o n . L i n q . J O b j …