Nodejs+express后端学习笔记(1)

1 Node.js安装

1、下载安装包:进入官网(https://nodejs.org/en),下载左侧的稳定版。
在这里插入图片描述

2、选择安装位置,不用勾选自动安装必要工具。
其他都默认Next。
在这里插入图片描述
配置环境,具体参考本文章:

https://blog.csdn.net/WHF__/article/details/129362462

2 Node.js使用

nodejs用来开发Web服务器(后端)。本文使用Visual Studio Code进行编写和调试。

2.1 REPL环境使用

命令行状态下输入:node,就可以进入。
可以进行简单的函数编写和计算。
1、输入函数:

> function add(a,b){return a+b;
}
> add(1,2)

会输出3。
在这里插入图片描述

2、输入调试:

console.log("hello")

在这里插入图片描述

2.2 基本知识、程序运行方法

1、JS文件的执行方式:js单线程执行,有异步任务,同步任务。

2、模块、包与commonjs规范:

  • 内置(Nodejs自带)
  • 第三方模块(安装在node-modules文件夹中)
    • npm
    • npm install 模块名 --save
    • npm uninstall 模块名
  • 自定义(项目里独立的js文件,根据commonjs规范定义)

3、运行js代码:node ****.js

2.3 第一个js文件

1、console
新建一个文件夹,在文件夹内新建helloworld.js文件,文件内容如下:

//helloworld.js
console.log("hello, world!");

运行代码,在终端控制台输入:node helloworld.js,程序将会反馈出hello, world!

在这里插入图片描述

2、function函数定义和调用
代码如下:

console.log("hello, world!");function add(a,b){return a+b;
}console.log(add(1,2));

控制台输入输出:

PS G:\Visual Studio\Nodejs_Project\nodejs_test> node .\helloworld.js
hello, world!
3

2.4 外部js文件导入

如果要使helloworld.js文件能够引用其他js文件,需要使用require函数。
1、在同级文件夹下新建utils.js文件,文件内容如下:

function add(a,b){return a+b;
}
function about(){return "服务器";
}
const name = "utils"module.exports = {add,about,msg:"你好",name,
}

文件内能够定义变量、函数,并通过module.exports引出,以便其他文件调用。

2、文件引入:
helloworld.js文件中,使用require函数引入utils.js文件,然后调用文件内的参数,具体代码如下:

const util = require('./utils.js');console.log("hello, world!");console.log(util);
console.log(util.add(1,2));
console.log(util.about());
console.log(util.msg);
console.log(util.name);

3、代码运行:

PS G:\Visual Studio\Nodejs_Project\nodejs_test> node .\helloworld.js
hello, world!
{
add: [Function: add],
about: [Function: about],
msg: ‘你好’,
name: ‘utils’
}
3
服务器
你好
utils

2.5 export导出方法

1、导出对象

module.exports = {add,about,msg,...
}

2、导出值/属性

module.exports.add = add;
module.exports.about = about;
module.exports.msg = msg;
...

3、导出

export.add = add;
export about = about;
...

2.6 fs库使用、同步异步

1、fs库使用:如果要使用fs,管理文件系统。
直接const fs = require('fs')
有同步和异步的读取方法,两者都会按照顺序执行程序,但同步方法必须阻塞程序,等到数据读取出来,再继续执行。而异步方法则不会阻塞住程序,而是另外开一个回调函数(类似于中断处理函数),先执行下方代码,等到数据读取出来,再调用回调函数。因此,同步和异步的数据的呈现顺序会出现差异。代码如下:

const fs = require('fs');       // 文件系统模块console.log("-------------------------------")
// 异步读取,函数运行和读取到值的时间不同,读取到值之后,再调用function
console.log("a1");
fs.readFile("./text1.txt", "utf-8", function(error, res) {if(error){console.log(error);return;}console.log(res);
});
console.log("b1");
console.log("c1");// 同步读取文件,读取到文件之间把值给data
console.log("-------------------------------")
console.log("a2");
const data = fs.readFileSync("./text2.txt", "utf-8");
console.log(data);
console.log("b2");
console.log("c2");

代码运行如下,可以发现异步读取的函数输出结果不是按照顺序来的,但这种方法对于网络请求来说非常重要,能够避免因为网络速度较慢造成程序长时间阻塞。

-------------------------------
a1
b1
c1
-------------------------------
a2
text2
b2
c2
text1

2、异步方法也可以使用这种方式:相当于设置一个回调函数,等文件读取完成后调用回调函数。

function readFileCompletedHandle(error, res) {if(error){console.log(error);return;}console.log(res);
}fs.readFile("./text1.txt", "utf-8", readFileCompletedHandle);

2.7 更多官方库

链接:

https://nodejs.p2hp.com/api/v19/documentation/

3 express框架

3.1 初始化工程

使用命令npm init来创建新工程。里面的设置全部默认,设置完成后会出现一个package.json文件。

//package.json
{"name": "nodejs_test","version": "1.0.0","description": "","main": "helloworld.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "","license": "ISC"
}

3.2 npm

进入npm官网,查找需要的第三方函数库,比如gulp、express、mqtt等。
链接:

https://npm.p2hp.com/

3.3 引入express

在项目文件夹下,输入命令:

npm add express

然后项目中就会安装各种依赖包。
在这里插入图片描述

3.4 http构建服务器

新建http_demo.js文件,代码如下:

// http_demo.js
var http = require('http')// 通过http模块,创建web应用
var app = http.createServer((req,res) => {res.writeHead(200,{"ContentType":"text/plain"});res.end("hello world");
});// 通过监听端口启动
app.listen(3000,'localhost');
console.log("http://localhost:3000");

运行程序,启动服务器,终端输入:

node http_demo.js

可以看到程序输出:

http://localhost:3000

进入该网址,就可以看到:

在这里插入图片描述

如果想要停止服务器运行,使用Ctrl+C组合键关闭。

3.5 express构建服务器

express对http库进行了封装。
新建app.js文件,代码如下:

// 导入express
const express = require("express");const app = express()app.get('/',(req,res)=>{res.send('Hello World Express!');
})app.listen(3000,()=>{console.log("Express app at: http://localhost:3000");
})

运行程序:

node app.js

得到输出:

Express app at: http://localhost:3000

进入网页:
在这里插入图片描述

4 express路由

4.1 get、post、put、delete四种请求

app.js代码如下:

// 导入express
const express = require("express");const app = express()// get请求
app.get('/',(req,res)=>{res.send('Get Express!');
})
// post请求
app.post('/',(req,res)=>{res.send('Post Express!');
})
// put请求
app.put('/',(req,res)=>{res.send('Put Express!');
})
// delete请求
app.delete('/',(req,res)=>{res.send('delete Express!');
})app.listen(3000,()=>{console.log("Express app at: http://localhost:3000");
})

输入node app.js运行服务器。

浏览器能够看到Get Express!

在这里插入图片描述

下载Postman验证其他请求。

参考链接: https://blog.csdn.net/qq_37591637/article/details/88655294

输入网址:http://localhost:3000,左侧选择get、post、put、delete请求。点击Send,在底部就可以查看服务器返回的数据。
在这里插入图片描述
2、发送JSON格式数据:

//app.js
// get请求
app.get('/',(req,res)=>{res.send({"name":"小美","age":"18","message":"刚满十八岁~"});    // json格式数据
})

保存后重启服务器,刷新网页,可以看到:

在这里插入图片描述
postman也可以获得数据:

在这里插入图片描述
重启服务器比较麻烦,因此以下可以采用热部署。

4.2 热部署 nodemon

1、安装nodemon:
命令行输入:

npm install nodemon -d -g

-d的意思是作为依赖,可以自动添加到package.json中。
-g的意思是全局安装。

2、在package.jsonscript中修改:

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

3、使用npm start命令来启动服务器。

在这里插入图片描述
修改并保存app.js内的数据:

// get请求
app.get('/',(req,res)=>{// res.send('Get Express!');res.send({"name":"小兰","age":"16","message":"刚满十六岁~"});    // json格式数据
})

刷新浏览器,不用重启服务器,就可以看到返回数据的变化。

在这里插入图片描述

注意:如果出现nodemon : 无法将“nodemon”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再 试一次。问题的另外一个解决方法:

https://blog.csdn.net/yan_danfeng/article/details/109306687

4.3 路由模块化

将多个请求放置到其他文件。
新建router-demo.js,将部分app.js的代码移植到文件内,需要创建router对象,并在最后使用module.exports导出。

var express = require("express");// 创建router对象
var router = express.Router();// get请求
router.get('/',(req,res)=>{res.send({"name":"小兰","age":"16","message":"刚满十六岁~"});    // json格式数据
})
// post请求
router.post('/',(req,res)=>{res.send('Post Express!');
})
// put请求
router.put('/',(req,res)=>{res.send('Put Express!');
})
// delete请求
router.delete('/',(req,res)=>{res.send('delete Express!');
})module.exports = router;

app.js修改为:

// 导入 express
const express = require("express");
const router = require("./router-demo");
const app = express();
// 绑定路由
app.use(router);app.listen(3000,()=>{console.log("Express app at: http://localhost:3000");
})

重启服务器,可以看到服务依旧可以使用。

5 express中间件

5.1 修改状态Status

如果要get先返回状态(201),可以使用:

router.get('/',(req,res)=>{res.stauts(201).send({"name":"小兰","age":"16","message":"刚满十六岁~"});    // json格式数据
})

postman再次send以下,可以发现状态变化,从200变成201。
在这里插入图片描述

5.2 修改头部Headers

.set()可以组装头部,.end()表示一次响应的结束。

// get请求
router.get('/',(req,res)=>{res.set({"aHeader":"bHeader"});res.status(201).send({"name":"小兰","age":"16","message":"刚满十六岁~"});    // json格式数据res.end();
})

可以发现Headers内数据变化。
在这里插入图片描述

5.3 修改路径

如果从http://localhost:3000/user发送Get请求。
则可以修改app.js中绑定路由的参数,前面加上路径。

app.use('/user',router);

postman结果如下:依旧可以正常工作。
在这里插入图片描述

5.4 服务器读取请求

1、修改router-demo.js内get请求的函数:

var express = require("express");// 创建router对象
var router = express.Router();// get请求
router.get('/',(req,res)=>{// 请求对象console.log("req请求",req);// 响应对象res.set({"aHeader":"bHeader"});res.status(201).send({"name":"小红","age":"16","message":"刚满十六岁~"});    // json格式数据res.end();
})
// post请求
router.post('/',(req,res)=>{res.send('Post Express!');
})
// put请求
router.put('/',(req,res)=>{res.send('Put Express!');
})
// delete请求
router.delete('/',(req,res)=>{res.send('delete Express!');
})module.exports = router;

使用浏览器/postman发送一次请求,在VS Code的终端能够看到服务器的console.log调试信息,可以发现非常的长。

req请求 <ref *2> IncomingMessage {_readableState: ReadableState {highWaterMark: 16384,buffer: BufferList { head: null, tail: null, length: 0 },length: 0,pipes: [],awaitDrainWriters: null,[Symbol(kState)]: 1185840},...[Symbol(kHeadersCount)]: 28,[Symbol(kTrailers)]: null,[Symbol(kTrailersCount)]: 0
}

2、如果浏览器/postman发送了参数:
在这里插入图片描述
服务器读取方法如下:req.query.*****,*****是params中的Key值,输出的是value。

// get请求
router.get('/',(req,res)=>{// 请求对象console.log("req请求: ",req.query.gender);// 响应对象res.set({"gender":req.query.gender});res.status(201).send({"name":"小红","age":"16","message":"刚满十六岁~"});    // json格式数据res.end();
})

服务器控制台可以看到:

在这里插入图片描述

postman可以看到:

在这里插入图片描述

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

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

相关文章

智能风扇控制系统设计与实现

一、摘要 随着科技的不断发展&#xff0c;人们对生活质量的要求越来越高&#xff0c;特别是在家居环境方面。智能风扇控制系统作为智能家居的重要组成部分&#xff0c;可以为用户提供更加舒适、便捷的生活体验。本文主要介绍了一种基于单片机的智能风扇控制系统设计与实现方法…

WPF 怎么判断MediaElement视频播放完成

WPF MediaElement控件中没有属性可以直接判断视频是否被播放完了&#xff0c;那要怎么判断视频是否播放完成呢&#xff1f; 其实我们可以使用订阅MediaEnded事件&#xff0c;当视频播放完后&#xff0c;会触发该事件。 MediaElement.MediaEnded Event&#xff1a;在媒体结束时发…

提升网络安全重要要素IP地址

在数字化时代&#xff0c;网络安全已经成为人们关注的焦点。本文将深入探讨网络安全与IP地址之间的紧密联系&#xff0c;以及IP地址在构建数字世界的前沿堡垒中的关键作用。 网络安全是当今数字社会中不可忽视的挑战之一。而IP地址&#xff0c;作为互联网通信的基础协议&#…

数据结构 —— 手写排序算法

数据结构 —— 手写排序算法 一、堆排序二、快速排序 能手撸堆排序和快速排序&#xff0c;相信你在面试中已经能应付大部分排序问题了。 一、堆排序 建堆算法在面试中非常常见&#xff0c;我曾经就遇到过。因此为避免踩坑&#xff0c;特此开记录帖。堆必须是一棵完全二叉树&a…

Allegro如何进行四层板板层设计

Allegro如何进行四层板板层设计 板层设计说明 在进行多层板设计时我们画好PCB板框后&#xff0c;都要进行板层的设计。这里就以最简单的4层板为例为大家举例说明。 板层设置 点击“Setup”->“Cross Section Editor”如下图所示&#xff1a; 也可以直接点击工具栏进入…

java基于ssm框架的校园闲置物品交易平台论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园闲置物品交易平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

LeetCode-Z 字形变换(6)

题目描述&#xff1a; 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R 之后&#xff0c;你的输出需要从左往…

安防监控EasyCVR视频融合/汇聚平台大华热成像摄像机智能告警上报配置步骤

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

python实现圆圈烟花_附完整源码【第21篇—python过新年】

文章目录 前言效果图&#xff08;动态&#xff09;完整代码代码讲解总结寄语 前言 烟花是一种庆祝、欢庆或庆典活动中常见的美丽表现&#xff0c;它们以多彩的光芒和炫丽的形状为人们带来欢乐和惊喜。在这个项目中&#xff0c;我们将使用Python编程语言创建一个简单而有趣的程…

Pytest的测试报告——Allure

一、html-report测试报告 html-report测试报告。是pytest下基本的测试报告。要使用pytest-html测试报告&#xff0c;就要确保python版本在3.6及以上即可。本身pytest所提供的测试结果汇总&#xff0c;是基于控制台的文本输出形式。 pytest-html是基于HTML格式实现的测试报告的…

无心剑汉英双语诗《一亩三分地》

一亩三分地 My Small World 二十四年世事变幻 拨号上网曾争分夺秒 如今不限流量肆意冲浪 大数据&#xff0c;云计算&#xff0c;人工智能 洗刷着世间各行各业 周围人&#xff0c;生活不断升级 房子&#xff0c;车子&#xff0c;妻子…… 换了一茬又一茬 洋溢着自豪的表情 而我…

[NOIP2014 提高组] 生活大爆炸版石头剪刀布#洛谷

题目背景 NOIP2014 提高组 D1T1 题目描述 石头剪刀布是常见的猜拳游戏&#xff1a;石头胜剪刀&#xff0c;剪刀胜布&#xff0c;布胜石头。如果两个人出拳一样&#xff0c;则不分胜负。在《生活大爆炸》第二季第 8 集中出现了一种石头剪刀布的升级版游戏。 升级版游戏在传统…

【Python_PyQtGraph 学习笔记(目录)】

【Python_PyQtGraph 学习笔记&#xff08;目录&#xff09;】 本专栏介绍如何使用 PyQtGraph 进行绘图操作&#xff0c;PyQtGraph 是基于 Qt 的纯 Python 库&#xff0c;如果使用 pyqt 进行图形界面开发&#xff0c;PyQtGraph 是很好的选择。 下面是专栏的目录汇总&#xff1a;…

无心剑七绝《未晚斋》

七绝未晚斋 倏忽半世莫伤怀 醉爱夕阳未晚斋 汉韵唐风情不尽 东华曼舞咏云台 2024年1月6日 新韵四开平韵 《未晚斋》这首诗&#xff0c;作者无心剑以其独特的笔触&#xff0c;描绘出了一幅宁静、淡雅的画面。诗中表达了对生活的热爱和对美好时光的珍惜。 首句“倏忽半世莫伤…

浏览器渲染原理(面试重点)

一、浏览器是如何渲染页面的 常见的简洁答案&#xff1a; 浏览器内核拿到内容后&#xff0c;渲染流程大致如下&#xff1a;解析HTML&#xff0c;构建Dom树&#xff1b;解析CSS&#xff0c;构建Render树&#xff1b;&#xff08;将CSS代码解析成树形的数据结构&#xff0c;与D…

使用nsight system 分析python进程

有时候我们的推理引擎是通过python脚本调用的&#xff0c;比如&#xff1a; python脚本调用TensorRT engine进行推理。 如果我们想用nsight system 分析性能&#xff0c;该怎么搞呢&#xff1f; 方法如下&#xff1a; 首先直接nsys profile 后面跟要执行的python命令就行 $…

一个vue3的tree组件

https://download.csdn.net/download/weixin_41012767/88709466

lldb in android studio

命令 n 单步s 进入函数, step intofini 函数返回, step outc 继续执行bt 显示调用栈, 标记*的行, 为当前帧(函数)frame info 显示栈当前所在的当前帧frame select [数字] 在当前栈中选择某个帧var 显示所有局部变量dis 显示汇编, 箭头位置为执行位置ni 汇编单步si 汇编进入函数…

c# vb.net检测字符串是否匹配一组相似度数组input Like

VB.NET 检测字符串是否符合一个数组中的多个like条件&#xff0c;有没有最简单的函数&#xff1f; 在VB.NET中&#xff0c;可以使用Enumerable.Any方法结合String.Like方法来检测一个字符串是否符合一个数组中的多个LIKE条件。Enumerable.Any方法用于确定序列中的任何元素是否…

java SSM社区文化服务管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM社区文化服务管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的 源代码和数据库&#xff0c;系统主…