Node.js核心模块-http
通过node中的http模块可以创建编写服务器
引入
const http = require('http')
http举例使用:
const http = require('http') //引入
const server = http.createServer() //创建web服务器
// 服务器可以提供的服务:对数据的服务
// 1、发请求
// 2、接收请求
// 3、处理请求
// 4、发送响应 server.on('request', () => {
console.log('收到客户端的请求了')
//当客户端请求过来就会自动触发request请求事件,然后执行回调参数
})
//绑定端口号,启动服务器
server.listen(3000, () => {
console.log('服务器启动成功,可以通过访问http://127.0.0.1:3000/来进行访问')
})
当使用node运行上面代码时,会看到终端中打印出 服务器启动成功,可以通过访问http://127.0.0.1:3000/来进行访问 。在浏览器中打开 http://127.0.0.1:3000/ 地址,会看到终端中打印出 收到客户端的请求了 。不停的刷新页面会不停的打印出这句话。浏览器一直处在加载状态,因为我们所创建的服务器并没有返回信息,客户端一直在等待
http.createServer([options][, requestListener])
可以创建一个Web服务器,返回一个 http.Server 实例
第二个参数requestListener是一个自动添加到 'request' 事件的函数。也就是说
const server = http.createServer()
server.on('request', (req, res) => {
console.log('执行request监听事件')
})
server.listen(3002)
等价于
const server = http.createServer((req, res) => {
console.log('执行request监听事件')
}).listen(3002)
http.server类
http.server类的事件也是通过 on 绑定
server.on('事件名称', callback)
request事件
每次有请求时都会触发,端口号后的字符串怎么改变都会触发这个事件
server.on('request', () => {
console.log('收到客户端的请求了')
//当客户端请求过来就会自动触发request请求事件,然后执行回调参数
})
回调函数中有两个参数:request与response
参数request
请求对象,可以用来获取客户端的一些请求信息,例如请求路径。参照http.IncomingMessage 类
参数response
响应对象,可以用来给客户端发送响应消息,具体属性与方法同http.ServerResponse类
server.listen()
启动 HTTP 服务器监听连接。
server.listen([port][,callback])
- port:可选,端口号
- callback:可选,回调函数
http.ServerResponse 类
作为第二个参数传给 request 事件
response.write(chunk[, encoding][, callback])
可以给客户端发送响应数据。write可以使用多次(一般不会使用多次,都使用end直接发送数据),但最后一定要使用end来结束响应,否则客户端会一直等待
server.on('request', (request, response) => {
console.log(`收到客户端的请求了,请求路径是${request.url}`)
response.write('hello')
response.write('nodejs')
//必须有end
response.end()
})
打开浏览器,网页中显示hellonodejs
response.end([data[, encoding]][, callback])
- data:必须是字符串或者二进制数据
响应完成时调用。可以省略write直接在end时发送响应数据
server.on('request', (req, res) => {
res.end('hello nodejs')
})
当data不是字符串或者二进制时会报错
server.on('request', (req, res) => {
const product = [
{
name: '苹果x',
price: '8888'
}, {
name: '大菠萝',
price: '5000'
}, {
name: '小辣椒',
price: '1999'
}
]
res.end(product)
//报错:The "chunk" argument must be one of type string or Buffer
})
数组或对象要使用JSON.stringify转换成字符串
res.end(JSON.stringify(product))
response.setHeader(name, value)
- name:字符串
- value:值
设置响应头。
当我们直接用res.end(中文字符)时,在浏览器中打开是乱码的,
const server = http.createServer((req, res) => {
res.end('你好')
}).listen(3002)
这时我们需要添加响应头设置content-type,之后浏览器就会正常显示中文字符不会乱码了。text/plain为普通文本
const server = http.createServer((req, res) => {
res.setHeader('Content-type', 'text/plain;charset=utf-8')
res.end('你好')
}).listen(3002)
如果需要发送的是html格式的字符串,需要设置content-type为text/html,浏览器就能将返回的内容作为html内容解析
const server = http.createServer((req, res) => {
res.setHeader('Content-type', 'text/html;charset=utf-8')
res.end('<a href="#">你好,请点击</a>')
}).listen(3002)
如果返回的是整个html文档,也可在HTML页面中通过meta元数据来声明当前文本的编码格式
node.js
fs.readFile('./www/apple/login.html', (err, data) => {
res.end(data)
})
login.html
<!DOCTYPE html>
<html> <head>
<meta charset="UTF-8">
<!-- 声明编码类型 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head> <body>
<h3>登录</h3>
</body> </html>
具体content-type对照表请查看https://www.cnblogs.com/lianglanlan/p/12171713.html
response.statusCode
设置发送给客户端的状态码。例如在需要临时重定向时需要设置状态码为302
res.statusCode = 302
res.setHeader('Location', '/')
res.end()
http.IncomingMessage 类
作为第一个参数传给server的request事件,以下使用message替代
message.url
请求的url字符串。端口号后面的字符串,所有的url都是以'/'开头
server.on('request', (request) => {
console.log(`收到客户端的请求了,请求路径是${request.url}`)
})
在浏览器中输入 http://127.0.0.1:3000终端会打印出 收到客户端的请求了,请求路径是/
在浏览其中输入 http://127.0.0.1:3000/a终端会打印出 收到客户端的请求了,请求路径是/a
判断url路径处理响应
server.on('request', (req, res) => {
const url = req.url
if (url === '/') {
res.end('index page')
} else if (url === '/login') {
res.end('login page')
} else {
res.end('404 Not Found')
}
})
message.socket
最新文章
- 监控Mysql主从环境下Slave延迟状态的操作记录
- php安全的改进以及检测文件是否被篡改
- NAVICATE 修改存储过程提示PROCEDURE _Navicat_Temp_Stored_Proc already exists 解决方法
- TI的AM3359的sd卡分区以及sd卡启动说明
- yii2源码学习笔记(十一)
- WPF中TreeView数据结构解析
- 设计模式UML图
- ListCtrl中垂直滚动条自动滚动
- pd_ds中的hash
- pytorch实现AlexNet网络
- 【转载】在线yml与properties文件转换工具
- js数组的用法
- 洛谷 P3225 [HNOI2012]矿场搭建 解题报告
- luogu P2662 牛场围栏
- 拖拽文件实现无刷新上传,支持2G文件
- 《剑指offer》— JavaScript(29)最小的K个数
- LeetCode - 637. Average of Levels in Binary Tree
- 解释mysql 语句 ——解释CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
- kylin加载hive表错误:ERROR [http-bio-7070-exec-10] controller.TableController:189 : org/apache/hadoop/hive/conf/HiveConf java.lang.NoClassDefFoundError: org/apache/hadoop/hive/conf/HiveConf 解决办法
- sailsjs入门到精通(一)
热门文章
- 05讲基础篇:某个应用的CPU使用率居然达到100%,我该怎么办
- [Python源码剖析]获取Python小整数集合范围
- HDU_3038_并查集
- 题解 CF1292A 【NEKO&#39;s Maze Game】
- angularJS 格式化日期 转载
- vue 入门 ------简单购物车功能实现(全选,数量加减,价格加减)
- 见异思迁:K8s 部署 Nginx Ingress Controller 之 kubernetes/ingress-nginx
- 动态获取bind dns日志IP脚本
- 使用Java, AppleScript对晓黑板进行自动打卡
- Nginx是什么 ? 能干嘛 ?