node.js

什么是Node.js

Node.js 是一个免费的、开源的、跨平台的 JavaScript 运行时环境,使开发者可以搭建服务器端的JavaScript应用程序

概念: 使用Node.js编写后端程序 // 支持前端工程化

​ 后端程序:提供接口和数据 ,网页资源

前端工程化:对代码压缩,转译,整合测试 自动部署(使用各种工具,提升效率)

Node.js为何能执行js?

浏览器能执行js代码,依靠的是内核中的v8引擎(c++程序)

Node.js是基于Chrome V8引擎 进行封装(运行环境)
区别:都支持ECMAScript标准语法,Node.js有独立的api (Node环境没有DOM和Bom)
在这里插入图片描述

Node.js安装

https://nodejs.org/dist/v18.17.0/ 下一步安装

注意:

1: 安装在非中文路径下

2.无需勾选安装其他的配置软件

检测是否安装成功

windows+r 打开cmd中断 输入node -v 命令 查看版本号

使用node.js

新建js文件,编写代码,在node环境下运行

在vscode集成终端中,输入node xxx.js 回车执行

console.log("hello")
for(let i = 0;i<3;i++){console.log(6)
}

fs模块-读写文件

模块:类似插件,封装了方法/属性

fs模块:封装了与本机文件系统进行交互的 方法/属性

加载fs模块

const fs = require('fs')

写入文件内容

fs.writeFile('文件路径','写入内容',err=>{//写入后的回调函数
})

读取文件内容

fs.readFile('文件路径',(err,data)=>{//写入后的回调函数//data文件内容的Buffer数据流
})

path模块–路径处理

在node.js中,使用绝对路径

__dirname 模块内置变量(获取当前模块目录名)

案例-压缩前端 html

压缩前端代码,让浏览器加载网页更快

前端工程化:对代码压缩,转译,整合测试 自动部署(使用各种工具,提升效率)

需求:把回车符 和换行符去掉 进行压缩,写入到新html中

  • 读取html文件内容
  • 正则替换字符串
  • 写入到新的html文件中

public/index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><div class="box"><ul><li>111</li><li>222</li><li>333</li></ul></div>
</body></html>

public/index,js

console.log('123');
for (let i = 0; i < 4; i++) {console.log(i);
}

build.js

/* 
需求:把public/index.html里的回车符,和换行符去掉,进行压缩,写入到新dist/index.html中- 读取html文件内容
- 正则替换字符串
- 写入到新的html文件中需求:压缩js里的代码,并整合到html中一起运行
1.读取js文件内容
2.正则替换内容  
3.拼接html内容写入到 dist/index.html
*/const fs = require('fs')
const path = require('path')// 把public / index.html里的回车符,和换行符去掉,进行压缩,写入到新dist / index.html中
fs.readFile(path.join(__dirname, 'public', 'index.html'), (err, data) => {const htmlStr = data.toString()// console.log(htmlStr);// 正则替换字符串const resultStr = htmlStr.replace(/[\r\n]/g, '')// console.log(resultStr);fs.readFile(path.join(__dirname, 'public', 'index.js'), (err, data1) => {const jsStr = data1.toString()// console.log(jsStr);// 正则替换字符串const jsResultStr = jsStr.replace(/[\r\n]/g, '').replace(/console.log\('.+'\);/g, '')// console.log(jsResultStr);// 写入到新的html文件中fs.writeFile(path.join(__dirname, 'dist', 'index.html'), resultStr + jsResultStr, err => {if (err) { console.log(err); }else { console.log('压缩成功'); }})})
})

URL中的端口号

URL :统一资源定位符,简称网址,用于访问网络上的资源

端口号:标记服务器里对应服务程序(0-65535的整数)

http://xxxx.com:88/api/login

http模块–创建web服务

基于http模块编写程序,返回给请求方 ‘hello world’

  • 引入http模块,创建web服务对象
  • 监听request请求事件,对本次请求,做一些响应处理
  • 启动web服务监听对应端口号
  • 运行本服务在终端,用浏览器发起请求

案例:基于web服务,开发提供省份列表数据的接口,了解后端的代码工作过程

test01.js

/*1.基于http模块,创建web服务2.使用req.url 获取请求资源路径,并获取province.json 里省份数据返回给请求方3.其他路径,暂时返回不存在的提示4.运行web服务,用浏览器发起请求
*/
// 1. 基于http模块,创建web服务
const fs = require('fs')
const path = require('path')
const http = require('http')
const server = http.createServer()// 2. 监听request请求事件,对本次请求,做一些响应处理
server.on('request', (req, res) => {// console.log(req.url);if (req.url === '/api/province') {fs.readFile(path.join(__dirname, 'data/province.json'), (err, data) => {res.setHeader('Content-Type', 'application/json;charset=utf-8')res.end(data.toString())})} else {res.setHeader('Content-Type', 'text/html;charset=utf-8')res.end('您请求的资源不存在')}
})server.listen(3000, () => {console.log('web 服务启动了');
})

参数查询
test02.js

/* 1.基于http模块,创建web服务2.判断req.url资源路径 +查询字符串  路径前缀匹配  /api/city3.借助 querystring 模块的方法,格式化查询字符串  ?pname = '北京'{pname:"北京"}4.获取city.json 里省份下的城市列表4.返回城市列表 运行web服务,用浏览器发起请求
*/
// 1. 基于http模块,创建web服务
const qs = require('querystring')
const fs = require('fs')
const path = require('path')
const http = require('http')
const server = http.createServer()// 2. 监听request请求事件,对本次请求,做一些响应处理
server.on('request', (req, res) => {// console.log(req.url);// 使用req.url 获取请求资源路径,并获取province.json 里省份数据返回给请求方if (req.url === '/api/province') {fs.readFile(path.join(__dirname, 'data/province.json'), (err, data) => {res.setHeader('Content-Type', 'application/json;charset=utf-8')res.end(data.toString())})// startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。} else if (req.url.startsWith('/api/city')) {// /api/city?pname =北京// 以?分隔符分隔  拿到pname=北京 // 把查询参数字符串 转成js对象结构const str = req.url.split('?')[1]// console.log(str);const query = qs.parse(str)console.log(query);// 拿到省份名字const pname = query.pname// 读取city.json 城市数据,匹配省份名字下的城市列表fs.readFile(path.join(__dirname, 'data/city.json'), (err, data) => {const obj = JSON.parse(data.toString())// 省份名字作为key,去obj对象里取到对应的城市const cityList = obj[pname]res.setHeader('Content-Type', 'application/json;charset=utf-8')res.end(JSON.stringify(cityList))})} else {res.setHeader('Content-Type', 'text/html;charset=utf-8')res.end('您请求的资源不存在')}
})server.listen(3000, () => {console.log('web 服务启动了');
})

test03.js

const qs = require('querystring')
const fs = require('fs')
const path = require('path')
const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {if (req.url === '/api/province') {fs.readFile(path.join(__dirname, 'data/province.json'), (err, data) => {res.setHeader('Content-Type', 'application/json;charset=utf-8')res.end(data.toString())})} else if (req.url.startsWith('/api/city')) {const str = req.url.split('?')[1]const query = qs.parse(str)// console.log(query);const pname = query.pnamefs.readFile(path.join(__dirname, 'data/city.json'), (err, data) => {const obj = JSON.parse(data.toString())const cityList = obj[pname]res.setHeader('Content-Type', 'application/json;charset=utf-8')res.end(JSON.stringify(cityList))})} else if (req.url === '/index.html') {fs.readFile(path.join(__dirname, 'dist/index.html'), (err, data) => {res.setHeader('Content-Type', 'application/json;charset=utf-8')res.end(data.toString())})}})
server.listen(3000, () => {console.log('web服务开启了');
})

基于express软件包,创建web服务

/* 
基于express本地软件包  开发web服务 返回资源给请求方
*/
// 1.下载express软件包
// 2.导入并创建web服务对象
const express = require('express')
const server = express()// 3.监听请求的方法和资源路径
server.get('/', (req, res) => {res.send("您好 欢迎使用express")
})server.get('/province', (req, res) => {res.send("省份已查询到")
})// 4/监听任意的请求方法和请求的资源路径
server.all('*', (req, res) => {res.status(404)res.send("您访问的资源路径不存在")
})// 5监听端口号 启动web服务
server.listen(3000, () => {console.log("web服务已启动")
})

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

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

相关文章

成员变量和局部变量的区别

局部变量成员变量 1、定义的位置不一样 在方法的内部&#xff0c;方法申明上&#xff08;形参&#xff09;。 声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量 在方法的外部&#xff0c;直接写在类当中 &#xff08;类中方法外的变量&#xff09; 2、作用范…

《孤注一掷》现实版:29万打水漂,华为程序员也躲不过的诈骗!!!

明天周五&#xff0c;约吗&#xff1f; 不管怎样&#xff0c;反正播妞已经订好了《孤注一掷》的电影票。不为别的&#xff0c;《孤注一掷》太敢拍了&#xff01;&#xff01;&#xff01; 美女荷官在线发牌&#xff0c;高知程序员在线养“猪”&#xff0c;诈骗头目“虔诚”拜佛…

UGUI组件EventTrigger用法

一.Unity编辑器中EventTrigger组件用法 1.添加事件类型 2.绑定gameObject指定组件的方法 3.方法执行逻辑 public class NewBehaviourScript : MonoBehaviour {public void PointerDown(){Debug.Log("Trigger PointerDown");} } 4.按下鼠标&#xff0c;绑定方法成功…

杰发科技(合肥)2021笔试题

笔试时间:2020.10.17 ,10:30-12:00。 岗位:Linux 驱动工程师。 题型:选择题8道,填空题10道,编程题4道。 杰发科技主要做汽车电子,由北京四维图新控股,对汽车电子感兴趣的有机会可以应聘试试。 选择题 1、128,4 #include<stdio.h> unsigned int getstrsiz…

深度思考mysql面经

推荐 1 索引下推 Mysql性能优化&#xff1a;什么是索引下推&#xff1f; 1.1 定义 索引下推&#xff08;Index Condition Pushdown&#xff0c;简称 ICP&#xff09;是一种数据库优化技术。在传统的数据库查询中&#xff0c;数据库首先使用索引检索来找到符合索引条件的行&…

集成测试最全详解,看完必须懂了

目录 什么是集成测试 测试关注的重点 集成测试的三个级别 集成测试的模式 集成测试策略 自顶向下集成&#xff08;Top-Down Integration&#xff09; 三明治集成&#xff08;Sandwich Integration&#xff09; 基干集成&#xff08;Backbone Integration&#xff09; …

解决Windows:Call to undefined function exif_imagetype()

很明显,是php安装时没有打开某些扩展,以致不能执行exif_imagetype()这个方法,因此需要打开。 网上很多人说需要打开下面这两个扩展: extension=php_exif.dll extension=php_mbstring.dll 但只说对了一半,我一开始也按照网上文章说的打开这两个扩展,但是还是同样错误。…

23.8.8 杭电暑期多校7部分题解

1008 - H.HEX-A-GONE Trails 题目大意 有两个玩家和一棵树&#xff0c;初始状态玩家一和玩家二分别在两个点 x , y x,\space y x, y&#xff0c;每次操作可以走一个与当前点有连边并且双方都没走到过的点&#xff0c;问最后是谁赢 解题思路 因为不能走走过的点&#xff0c…

[Vulnhub] matrix-breakout-2-morpheus

目录 <1> 信息收集 <2> getshell <3> Privilege Escalation&#xff08;提权&#xff09; <1> 信息收集 nmap -sP 192.168.236.0/24 扫描一下靶机ip 靶机ip: 192.168.236.154 nmap -A -p 1-65535 192.168.236.154 扫描一下靶机开放哪些服务 开放…

PyQt学习笔记-Windows系统版本兼容问题踩坑记录

1 Pyinstaller打包的exe在Win10上可以使用&#xff0c;在Win7上缺提示找不到dll。 错误信息&#xff1a; Traceback (most recent call last): File "main.py", line 4, in <module> ImportError: DLL load failed while importing QtWidgets: 找不到指定的…

2023全新UI好看的社区源码下载/反编译版

2023全新UI好看的社区源码下载/反编译版 这次分享一个RuleAPP二开美化版&#xff08;尊重每个作者版权&#xff09;&#xff0c;无加密可反编译版本放压缩包了&#xff0c;自己弄吧&#xff01;&#xff01;&#xff01; RuleAPP本身就是一款免费开源强大的社区&#xff0c;基…

海外应用商店优化实用指南之元数据的迭代更新

随着每天都有新应用程序加入App Store和Google Play商店&#xff0c;许多应用程序都会针对与我们相同的关键词&#xff0c;虽然我们的元数据保持不变&#xff0c;但竞争对手的应用会重新编入索引&#xff0c;最终导致我们的关键词排名随着时间的推移稳步下降。 1、迭代的重要性…

C语言——九九乘法表

//九九乘法表 //用程序做一个九九乘法表 #include<stdio.h> int main() {int i,j,result;printf("\n");for(i1;i<10;i){for(j1;j<i;j){resulti*j;printf(" %d*%d%-d",i,j,result);}printf(" \n");}}

React Router@3.x 升级到 @6.x 的实战

一、概述 目前公司产品有关 react 的工具版本普遍较低,其中react router版本为 3.x(是的,没有看错,3.x 的版本,4年前的版本)。而最新的 react router 已经到了 6.x 版本。 为了能够跟上路由的脚步,也为了使用 router 相关的 hooks 函数,一次必不可少的升级由此到来!由于…

获取当前线程中的请求属性的静态方法

RequestContextHolder.getRequestAttributes() 是 Spring 框架中用于获取当前线程中的请求属性的静态方法。它通常在 Web 应用中使用&#xff0c;用于访问当前请求的上下文信息。在 Spring 的 Web 应用中&#xff0c;每个请求都会有一个对应的请求上下文&#xff0c;其中包含了…

【数据库】P0 创建数据库环境 MySQL + DataGrip

创建数据库环境 下载安装 MySQL下载安装 DataGrip 下载安装 MySQL Windows版本_MySQL 下载地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 下载后依照默认顺序安装即可&#xff0c;本博文将讲述简约安装步骤&#xff1b; 如需详细安装步骤可见&#xff1a;https:/…

4.1、Flink任务怎样读取集合中的数据

1、API说明 非并行数据源&#xff1a; def fromElements[T: TypeInformation](data: T*): DataStream[T] def fromCollection[T: TypeInformation](data: Seq[T]): DataStream[T] def fromCollection[T: TypeInformation] (data: Iterator[T]): Data…

【设计模式】观察者模式

什么是观察者模式&#xff1f; 观察者模式&#xff08;又被称为发布-订阅&#xff08;Publish/Subscribe&#xff09;模式&#xff0c;属于行为型模式的一种&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态…

leetcode做题笔记64

给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 思路一&#xff1a;动态规划 int minPathSum(int** grid, int gridSize, int* gridColSi…

STM32 CubeMX USB_MSC(存储设备U盘)

STM32 CubeMX STM32 CubeMX USB_MSC(存储设备U盘&#xff09; STM32 CubeMX前言 《使用内部Flash》——U盘一、STM32 CubeMX 设置USB时钟设置USB使能UBS功能选择FATFS功能 二、代码部分修改代码"usbd_storage_if.c"修改代码"user_diskio.c"main函数初始化插…