从0开始了解node.js

本文介绍了Node.js的基本概念及其在后端开发中的应用,详细讲解了如何使用fs模块进行文件操作,以及Node.js的模块化编程。接着,讨论了npm包管理器和原生开发web服务器的核心——http模块。此外,还介绍了流行的Express框架,包括其主要特性、步骤示例和中间件机制。最后提到了阿里云vod视频点播服务的相关内容。
摘要由CSDN通过智能技术生成

node.js

简介: javaScript的一个运行环境,例如浏览器中的js解析引擎V8
解析: javaScript代码 ——> 引擎解析 ——> 机器可执行代码

作用

  • 后端web服务器开发与网络爬出开发
  • 脚手架命令行工具
  • 图形界面应用程序开发

node、浏览器与js的关系

在这里插入图片描述

fs文件操作

1.引入fs模块

const fs = require('fs');

2.读取文件

fs.readFile('文件路径', '字符编码', ('错误信息参数', '读取的文件内容数据') => {})

3.写入文件(清空并且替换目标文件内容)

// 如果写入成功,则回调参数为null
fs.writeFile('文件路径', '写入的内容', ('错误信息参数') => {});

4.追加文件内容

fs.readFile('', '', (err, data) => {
	if (!err) {
		fs.writeFile('', data + '追加的内容', (err) => {})
	}
})

模块化编程

1.ComminJS(node服务端)

  • require导入
  • module.exports或exports导出

2.AMD、UMD
3.ES6 Module标准,node默认是不支持该标准的,如果要使用,需要在package.json中配置 type: "module"

  • import from 导入
  • export或export default导出

npm包管理器

npm传送门

node原生开发web服务器

服务器与客户端之间的交互

客户端 服务器 1.服务器地址 2.通过服务器地址发起http请求 3.接受请求 4.处理请求 5.返回处理结果 6.断开连接 响应处理结果,并断开连接 7.接收服务器响应,并处理响应数据 客户端 服务器

网络核心模块http

1.引入

const http = require('http');

2.创建服务器

// 获取服务器实例对象
const server = http.createServer();
// 监听端口
server.listen(8080, () => {});
// 监听客户端请求事件
server.on('request', ('所有请求信息req', '所有需要响应的信息res') => {
	// 设置响应头处理服务器数据响应类型
	res.setHeader('Content-type', 'text/plain;charest=utf-8'); // 纯文本信息,并指定utf-8字符集
	// res.setHeader('Content-type', 'text/html;charest=utf-8'); // html信息,并指定utf-8字符集
	// 写入响应数据渲染至浏览器
	res.write('响应数据');
	// 断开服务器
	res.end();
	// res.end('响应数据'); ===> res.write('响应数据') + res.end()
});

请求方式

方法说明
get获取服务器资源
post向服务器提交数据
put向服务器写入资源,如果已存在则进行替换
delete删除资源
head获取服务器响应首部
options询问服务器所支持的请求方法

1.GET请求参数获取

const url = require('url');
server.on('request',(req, res) => {
	// 获取请求方式,值是大写的,eg: GET、POST
	const requestMethod = req.method
	// 获取get请求参数
	const requestParam = url.parse('请求连接url', true).query; // {请求参数key: 请求参数值}
});

2.POST请求参数获取

// post请求的数据是以报文的形式进行传递,报文是一段一段分步传递的
server.on('request', (req, res) => {
	let data = '';
	// 每次当报文传递时,将每一次的报文数据片段追加如data中
	req.on('data', (dataPart) => {
		data += dataPart;
	});
	// 结束
	req.on('end', () => {
		// 报文中的data生成后为buffer数据,需要转换成js对象数据
		const queryString = require('querystring');
		queryString.parse(data);
	});
});

express nodeWeb框架(http服务)

详情介绍 👉 传送门

特性:

  • 具有丰富的基础API支持
  • 强大的路由功能
  • 灵活的中间件机制及第三方中间支持
  • 性能接近原生node
  • 安全稳定,代码测试覆盖率几乎百分之百

作用:

  • API接口服务器
  • 服务端渲染中间层
  • 开发辅助工具
  • 自定义集成框架

step1

安装: npm i -S express
引入: import express from 'express'
实例化: const app = express()
端口监听: app.listen(端口:number, () => {})
设置可接收数据类型为json,否则客户端传递json形式参数时,服务端会收不到: app.use(express.json())

step2

app服务实例中含有get、post等客户端请求接收API,可以对客户端的请求进行响应处理
请求路径支持正则匹配, 支持/:id 动态参数,通过req.params获取

get请求

// 接收客户端登陆接口请求处理
app.get('/login', (req, res) => { // req: 请求信息 res: 响应信息
	// 返回需要客户端下载的资源, 浏览器接到可下载指令
	// res.download();
	// 结束
	// res.end()
	// 重定向
	// res.redirect();
	// 模板渲染
	// res.render();
	// json格式返回
	// res.json();

	// req.query可以拿到get请求中的请求参数
	const param = req.query;
	// 判断是否有传入参数
	if (!param.name || !param.passward) {
		// 错误响应
		res.status(430).json({
			code: -1,
			message: '参数为空'
		});
	} else if (param.name !== 'tree' || param.passward !== 'bigTree') { // 判断密码与账号是否正确
		// 错误响应
		res.status(420).json({
			code: -2,
			message: '账号或者密码错误',
		})
	} else {
		// 当成功请求后,一般会去数据库中拉去数据响应给客户端
		fs.readFile('./db.json', 'utf-8', (err, data) = > {
			// 当err为null时,即读取文件成功
			if (!err) {
				// data 文件db.json中的数据,筛选后组装数据返回响应客户端
			}
		});
		// 正常响应
		res.send({
			code: 0,
			message: '登录成功',
		});
	}
});

post请求

// 领取积分接口
app.post('/receiveScore', (req, res) => {
	// req.body 可以拿到post请求中的参数
	const data = req.body;
	if (data.num) {
		// 当成功请求后,一般会将数据存入数据库中
		// 模拟存入json文件中,先读取到json数据文件,然后获取其中所有数据,再存入覆盖该json数据文件中
		fs.readFile('./db.json', 'utf-8', (error, dbData) => {
			if (!error) {
				const dbDataObj = JSON.parse(dbData);
				dbDataObj.remainScore += data;
				const newData = JSON.stringify(dataObj.remainScore);
				// 根据请求的数据更改或添加数据到数据库(json文件)
				fs.writeFile('./db.json', 'utf-8', (error) => {
					if (!error) {
					
					}
				});
			}
		});
		
		// 成功请求响应,并返回最新剩余积分
		res.send({
			code: 0,
			message: '领取成功',
			data: {
				remainScore: 30, // 最新剩余的积分
			},
		})
	} else if (typeof data.num !== 'number') {
		res.status(421).json({
			code: -2,
			message: '参数类型错误',
		});
	} else {
		res.status(420).json({
			code: -1,
			message: '请参数为空',
		});
	}
});

step3

1.当fs文件模块中的readFile与writeFile在回调中层层嵌套时,可能会形成回调地狱
2.为了避免回调地狱的产生,可以将文件模块的读取api转换成promise,用try catch以解决回调与地狱问题

代码如下:

// 引入util模块中的promisify方法
import { promisify } from "util";
// 利用promisify将回调形式的fs读取API转换成promise
const readFile = promisify(fs.readFile);
const writeFile = promisify(fs.writeFile);

const fn = () => {
	try {
		const fileData = readFlie('/', 'utf-8'); // 返回值为回调中的data,即文件数据信息
	} catch (error) {
		// 错误逻辑
	}
}

中间件

express().use() 注册中间件

分类

  • 应用程序级别中间件
  • 路由级别中间件
  • 错误处理中间件
  • 内置中间件
  • 第三方中间件

应用程序级别中间件

const app = express();
// 使用express提供的中间件机制
app.use((req, res, next) => {
	// 继续下一步路由处理(动作), 不然后续的处理无法执行
	next();
});

// 请求中间件处理
app.get('/', (req, res, next) => {
	
}, (req, res, next) => {}, ...)

路由级别中间件

// 服务实例
const app = express();
// 路由实例
const router = express.Router();
// 应用程序级别的路由挂载,路由中间件
app.use('/api', router); // 参数1: 可选参数,路由前缀
// router.use('/api', router); // 同上app.use

// 当上方中间件都没有匹配到时,执行下方中间件
app.use((req, res, next) => {
	res.status(404).send('404 Page Not Found');
})

// 路由匹配
router.get('/login', (req, res, next) => {
	// 响应
	res.send('回包');
});

错误处理中间件

代码报错处理

// 错误处理中间件
// 当代码或者逻辑出现错误, error中会存在错误信息
app.use((error, req, res, next) => {
	res.status(500).send('serice Error');
});

内置中间件

app.use(express.json());
app.use(express.static('public')); // 所有静态资源请求全部转发到public下

第三方中间件
跨域中间件 cors

npm i -S cors
const app = express();
const cors = require('cors');
// 注册跨域中间件
app.use(cors());

日志中间件

npm i -S morgan
const morgan = require('morgan');
// 注册日志中间件
app.use(morgan('dev')); // dev环境下执行日志

数据校验中间件 express-validator
传送门

npm i -S express-validator
const { body, validationResult } from 'express-validator';
const router = express.Router();

router
.post(
	'/login',
	// withMessage 设置提示信息
	// isLength 长度校验
	// notEmpty 数据是否为空校验
	// bail 如果验证通过,就继续往下执行,否则停止后续校验的执行,即使长度校验停止
	body('username').notEmpty().withMessage('用户名不能为空').bail().isLength({min: 3}).withMessage('用户名不能为空'), // 不能为空
	// isEmali 校验是否满足邮件格式
	body('email').isEmail();
	// 中间件
	(req, res, next) => {
		// 校验的错误信息
		const error = validationResult(req);
		// errorr为空时则校验通过
		if (error.isEmpty()) {
			return res.status(401).json({error: error.array()})
		}
		next();
	}
)

文件上传中间件

npm i -S multer
const multer = require('multer');

const upload = multer({desc: '/public'});

静态资源处理中间件

server.use(express.static());

阿里云vod视频点播服务

路由

express().all()

const app = express.Router();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值