从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 = 3000app.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 = 3000app.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的搭建和启动过程,演示了一个日志记录功能的搭建流程,后续还会介绍其他中间件已经路由的搭建过程,敬请期待。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】优先级队列——堆

🧧🧧🧧🧧🧧个人主页🎈🎈🎈🎈🎈 🧧🧧🧧🧧🧧数据结构专栏🎈🎈🎈&…

数码管时钟--LABVIEW编程

一、程序的前面板 1.获取系统时钟,年月日,时分秒,用14个数码管显示。 2.闹钟设定小时和分钟。 二、程序的后面板 三、程序运行图 四、程序源码 源程序可以在百度网盘自行下载,地址链接见下方。 链接:https://pan.b…

开源,微信小程序-超级计算器T3000 简介

笔者于四年前自学微信小程序开发,这个超级计算器T3000就是当时的练习作品。超级计算器T3000的功能有很多,其中的核心技术是矩阵计算,使用的工具库是math.js,其次是复杂运算和分式运算。关于math.js的使用,可以参考另一…

如何在极狐GitLab 配置 邮件功能

本文作者:徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户…

图片标注编辑平台搭建系列教程(4)——fabric几何定制渲染

背景 标注的几何,有时需要一些定制化的渲染样式,例如,线中间展示箭头,表示方向。本期教程教大家如何实现fabric几何定制化渲染。 带箭头的线 fabric提供了一些原生的几何,例如Point、Polyline、Polygon。同时提供了…

LangChain入门:2.OpenAPI调用ChatGPT模型

引言 在本文中,我们将带您深入探索如何通过OpenAPI与ChatGPT模型进行高效交互,实现智能文本问答功能。通过LangChain库的实践,您将学习构建一个能够与用户进行自然语言对话的系统的关键步骤。 准备步骤 在动手编码之前,请确保您…

Collection与数据结构链表与LinkedList(三):链表精选OJ例题(下)

1. 分割链表 OJ链接 class Solution {public ListNode partition(ListNode head, int x) {if(head null){return null;//空链表的情况}ListNode cur head;ListNode formerhead null;ListNode formerend null;ListNode latterhead null;ListNode latterend null;//定义…

Beans模块之工厂模块DisposableBean

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

宝塔面板操作一个服务器域名部署多个网站

此处记录IP一样,端口不一样的操作方式: 宝塔面板操作: 1、创建第一个网站: 网站名用IP地址,默认80端口。 创建好后,直接IP访问就可以了。看到自带的默认首页 2、接下来部署第二个网站: 仍然是…

docker-compose mysql

使用docker-compose 部署 MySQL(所有版本通用) 一、拉取MySQL镜像 我这里使用的是MySQL8.0.18,可以自行选择需要的版本。 docker pull mysql:8.0.18二、创建挂载目录 mkdir -p /data/mysql8/log mkdir -p /data/mysql8/data mkdir -p /dat…

IC-随便记

1、移远通信---通信模组 物联网解决方案供应商,可提供完备的IoT产品和服务,涵盖蜂窝模组(5G/4G/3G/2G/LPWA)、车载前装模组、智能模组(5G/4G/边缘计算)、短距离通信模组(Wi-Fi&BT)、GNSS定位模组、卫星通信模组、天线等硬件产…

阿里云CentOS7安装MySQL8

创建目录 [rootnode1 ~]# mkdir /usr/local/mysql [rootnode1 ~]# cd /usr/local/mysql/ 下载安装包 到MySQL官网查看需要下载的版本,并获取到下载地址 https://downloads.mysql.com/archives/community/下载 [rootnode1 mysql]# wget https://downloads.mysql…

Linux - 第三节

改变用户类型 su 仅单纯的进行身份变化 依旧处于普通用户里面 su - 进行重新登录更改身份 退出用exit / ctrld su 用户名 改成成其他身份 对一条命令进行提权 sudo command r:可读 w:可写 x:可执行 -:对应的权限位置,没有权限 去掉所有权限 chmod u…

java日志技术——Logback日志框架安装及概述

前言: 整理下学习笔记,打好基础,daydayup!!! 日志 什么是日志 程序中的日志,通常就是一个文件,里面记录的是程序运行过程中的各种信息,通过日志可以进行操作分析,bug定位等 记录日志的方案 程…

嵌入式系统基础知识(一):嵌入式系统是什么?

一.定义 根据IEEE(国际电气和电子工程师协会)的定义,嵌入式系统是“控制、监视或者辅助设备、机器和车间运行的装置”。这主要是从应用上加以定义的,从中可看出嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装…

云渲染实用工具:3ds max怎么改低版本?

3ds Max是建模领域广泛采用的专业软件,它通过定期更新来不断增强功能和提升性能。但这些频繁的更新有时会导致一些插件暂时无法与新版本完全兼容。为了解决这个问题,设计师们可以采用一个简单有效的方法,那就是将较新版本的3ds Max文件进行版…

Java常见限流用法介绍和实现

目录 一、现象 二、工具 ​​​​​​1、AtomicInteger,AtomicLong 原子类操作 ​​​​​​2、RedisLua ​​​​​​3、Google Guava的RateLimiter 1) 使用 2) Demo 3) 优化demo 4、阿里开源的Sentinel 三、算法 1、计数限流 &…

python练习二

# Demo85def pai_xu(ls_test):#创建一个列表排序函数命名为pai_xu# 对创建的函数进行注释"""这是一个关于列表正序/倒序排列的函数:param ls_test: 需要排序的列表:return:"""ls1 [int(ls_test[i]) for i in range(len(ls_test))]#对input输入的…

基于Java+Springboot+vue高校资源共享交流平台设计和实现

博主介绍:✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

C++刷题篇——05静态扫描

一、题目 二、解题思路 注意:注意理解题目,缓存的前提是先扫描一次 1、使用两个map,两个map的key相同,map1:key为文件标识,value为文件出现的次数;map2:key为文件标识,va…