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

news2024/11/25 16:41:16

目录

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

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

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

相关文章

大模型 web ui 界面 text-generation-webui

目录 前言 web ui ValueError: When localhost is not accessible 前言 使用 text-generation-webui 生成大模型界面,这个是专门用于文本对话生成的 web ui 界面 GitHub - oobabooga/text-generation-webui: A Gradio web UI for Large Language Models. Suppo…

【语言信号增强算法研究-1】维纳滤波(Wiener Filter)

1 语音增强方法分类 2 维纳滤波的局限性 对于非线性和非高斯噪声的处理效果不佳; 对于信号和噪声的统计特性要求比较高,需要准确地了解信号和噪声的分布规律(说明自适应很差); 在处理复杂信号时,需要进行多…

【Functional Affordances】如何确认可抓取的区域?(前传)

文章目录 1. 【Meta AI】Emerging Properties in Self-Supervised Vision Transformers2. 【Meta AI】DINOv2: Learning Robust Visual Features without Supervision3. 【NeurIPS 2023】Diffusion Hyperfeatures: Searching Through Time and Space for Semantic Corresponden…

ElasticSearch理论指导

引子 本文致力于ElasticSearch理论体系构建,从基本概念和术语讲起,具体阐述了倒排索引和TransLog,接着讲了ElasticSearch的增删改查的流程和原理,最后讲了讲集群的选举和脑裂问题。 前言 大碗宽面-Kafka一本道万事通&#xff0…

蓝桥杯真题:成绩统计

这题思路简单,但是输出结果的位置容易出错,题目要求四舍五入,所以要用Math.round()的方法

瑞吉外卖实战学习--10、完成新增菜品分类

完成新增菜品分类 前言1、前期准备定义实体类和实体对象 2、创建修改的接口 前言 1、前期准备 定义实体类和实体对象 package com.example.ruiji_demo.entity;import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; …

kubernetes-Pod基于污点、容忍度、亲和性的多种调度策略(二)

Pod调度策略 一.污点-Taint二.容忍度-Tolerations三.Pod常见状态和重启策略1.Pod常见状态2.Pod的重启策略2.1测试Always重启策略2.2测试Never重启策略2.3测试OnFailure重启策略(生产环境中常用) 一.污点-Taint 在 Kubernetes 中,污点&#x…

稻盛和夫|普通人如何才能取得非凡成就?

哈喽,你好啊,我是雷工! 稻盛和夫老先生曾经回答过这么一个问题: 资质平庸的普通人如何才能取得非凡的成就? 稻盛和夫认为:人生成就=能力努力态度。 也就是:做一个努力工作却不甘于只做眼前的事,而想要做更有挑战的事,这种人才能逃离平庸,取得非凡成就。 01 不甘平凡…

django+uniapp校园失物招领系统e5asg 微信小程序python

本失物招领小程序,使用的是比较成熟的python语言和比较完善的MySQL数据库,将网络失物招领小程序信息管理系统可以更安全、技术性更强的满足网站所有信息的管理。 失物招领小程序主要实现了管理员服务端模块、学生微信端模块二大部分。通过本失物招领小程…

200个有趣的HTML前端游戏项目合集(持续更新中)

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…

新生报到系统的设计与实现(论文+源码)_kaic

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对新生报到信息管理混乱,出错率高,信息安全性差…

11-2说说小滴课堂之前的被薅羊毛的事情+防范解决方案

11-2说说小滴课堂之前的被薅羊毛的事情防范解决方案

【LVGL-字库应用】

LVGL-中文字库应用 ■ LVGL-内部字库■ LVGL 内部字库的使用流程: ■ LVGL-自定义字库■ 方法一:C 语言数组(内部读取)-在线转换工具■ 方法二:C 语言数组(内部读取)-利用离线字体转换软件&…

【Java】API——Calendar日期类使用+题目演示

目录 Calendar日期类简单介绍 导入对应包: 获取 Calendar 对象: 设置日期和时间: 获取日期和时间的各个部分: 日期和时间的加减操作: 例题:世纪末的星期 题目描述 题目代码 Calendar日期类简单介绍…

FPGA之状态机学习

作为一名逻辑工程师,掌握和应用状态机设计是必不可少的。能够灵活的应用状态机是对逻辑工程师最基本的要求,状态机设计的好坏能够直接影响到设计系统的稳定性,所以学会状态机是非常的重要。 1.状态机的概念 状态机通过不同的状态迁移来完成特…

计算机网络—TCP协议详解:特性、应用(1)

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:マリンブルーの庭園—ずっと真夜中でいいのに。 0:34━━━━━━️💟──────── 3:34 🔄 ◀️…

YOLOv8部署到C++上(综合版笔记)

这段时间由于项目的需要,需要将yolov8部署到C上以及跟相应的算法结合,花了我不少时间。 现阶段有考虑过使用onnx转Tensort,但是无法输出分类的结果,故放弃,有目标检测的小伙伴可以试试,接下来使用onnxrunt…

Qt打印系统库的日志 - QLoggingCategory

Qt的动态库通过源码可以可以看到含有大量的qCInfo 和 qCDebug 等大量的日志, 但是我们正常运行Qt程序,这些动态库或插件里面的日志是不会输出到我们的控制台里面的。 所以本章主要记录怎么输出这些日志出来。 一: 步骤 主要使用的是Qt的 函…

第十四届省赛大学B组(C/C++)岛屿个数

目录 题目链接:岛屿个数 解题思路: AC代码(BFSDFS): 题目链接:岛屿个数 小蓝得到了一副大小为 MN 的格子地图,可以将其视作一个只包含字符 0(代表海水)和 1&#xff0…

机器人控制系统阶跃响应

机械臂控制系统的阶跃响应是指当给机械臂控制系统施加一个阶跃输入(即输入量在短时间内从0跳变为某个定值)时,机械臂的输出(如位置、速度等)随时间的变化情况。通过观察和分析阶跃响应,可以了解机械臂控制系…