通过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

同 net.socket

Node.js核心模块-http的更多相关文章

  1. node.js核心模块

    全局对象 global 是全局变量的宿主 全局变量 在最外层定义的 全局对象的属性 隐士定义的变量(未定义直接赋值的变量) 当定义一个全局变量时 这个变量同时也会成为全局对象的属性 反之亦然 注意: ...

  2. Node.js核心模块_全局变量、util学习

    全局对象 javascript的全局对象是window,他及其所有属性都可以在程序的任何地方访问.即全局变量. 而在node中全局对象是global,所有全局变量都是global对象的属性,包括其本身 ...

  3. Node.js核心模块-fs文件系统

    fs是file-system的简写,文件系统的意思.在Node中如果想要进行文件操作,就必须引入fs这个核心模块. 引入 const fs = require('fs') fs.readFile(pa ...

  4. 10.Node.js核心模块

    1.全局对象2.常用工具3.事件机制4.文件系统访问5.HTTP服务与客户端 一.全局对象(Global Object), 与window对象一样 process ==> 全局变量, 描述当前N ...

  5. Node.js核心模块API之文件操作

    参考:https://www.runoob.com/nodejs/nodejs-fs.html 异步I/O 1,文件操作 2,网络操作 在浏览器中也存在异步操作 1,定时任务 2,事件处理 3,Aja ...

  6. Node.js核心模块-net

    net.Socket 类 socket.remotePort 访问服务器的远程端口 const http = require('http'); const server = http.createSe ...

  7. Node.js之模块机制

    > 文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. ![file](https://img2018.cnblogs.com/blog/830272/20 ...

  8. Node.js核心入门

    前言: 因为以前学习Node.js并没有真正意义上的去学习它,而是粗略的学习了npm的常用命令和Node.js一些模块化的语法,因此昨天花了一天的时间看了<Node.js开发指南>一书.通 ...

  9. Node.js的模块载入方式与机制

    Node.js中模块可以通过文件路径或名字获取模块的引用.模块的引用会映射到一个js文件路径,除非它是一个Node内置模块.Node的内置模块公开了一些常用的API给开发者,并且它们在Node进程开始 ...

随机推荐

  1. 实验5: IOS的升级与恢复

    实验5:  IOS的升级与恢复 实验目的 通过本实验可以掌握 1)    掌握IOS 正常的情况下升级IOS2)    IOS 丢失的情况下使用TFTP恢复IOS3)    IOS 丢失的情况下使用X ...

  2. 验证码,java

    这几天打算写一个验证码出来 遇到了几个问题 imageio写入失败:原因我创建文件的时候是先建立一个text文本,然后修改后缀,图片写不进去,还有没有编译 图像扭曲:粘连的问题,目前解决图像扭曲的问题 ...

  3. Docker 代理脱坑指南

    Docker 代理配置 由于公司 Lab 服务器无法正常访问公网,想要下载一些外部依赖包需要配置公司的内部代理.Docker 也是同理,想要访问公网需要配置一定的代理. Docker 代理分为两种,一 ...

  4. POJ_1363_模拟

    题目描述: 列车出入站是一种栈的机制,每组数据给予一个n,进站按1-n顺序,给定一组出站顺序,判断能否实现. 思路: 直接用了queue,in记录当前准备入站的列车编号,out记录已经出站的辆数+1. ...

  5. 对char *f=new char[4]赋初值

    用new 开辟的可以直接指向字符串常量,但是之后就不能进行修改了比如 char * f=new char[4]; f="ab"; f[0]='0'//错误 但是可以输出f[0]; ...

  6. vue仓库、组件间通信、前后台数据交互、前端储存数据大汇总

    目录 路由重定向 仓库介绍 vuex插件:可以完成任意组件间信息交互(移动端) 前端存储数据大汇总 前后台交互方式(重点) 前后台数据交互 axios插件:完成前后台ajax交互的 同源策略 - 前后 ...

  7. RabbitMQ安装与使用

    官网地址: http://www.rabbitmq.com/ 安装Linux必要依赖包 下载RabbitMQ必须安装包 进行安装,修改相关配置文件即可 步骤 1.准备: yum install gcc ...

  8. 全网一定不是最好懂的C++线性筛素数

    Part 0:概念 先给几个概念(很重要): 合数:如果\(xy=z\text{且}x,y\text{为正整数}\),我们就说\(x,y\text{是}z\text{的合数}\) 素数:如果数\(a\ ...

  9. javascript 对象api

    // Object 构造函数的属性: Object.prototype//可以为所有 Object 类型的对象添加属性 class A extends B{ constructor(){ super( ...

  10. Nginx三大主要功能

    1.做静态资源服务器,可以用于前端项目发布,图片文件文件等静态服务器. 2.做反向代理服务器,域名往往配置在Nginx上,真正的业务服务器躲在其身后. 3.做负载均衡服务器,作为负载集群的入口网关. ...