实现一个发布系统

使用nodejs实现一个简单的发布系统。

本文并没有从零到一构建一个完整的发布系统,仅是抛砖引玉的一个demo版本

引入HTTP模块

编写一个简单的server

1
2
3
4
5
6
const http = require('http')

http.createServer(function(requst, response) {
console.log(requst)
response.end('hello word')
}).listen(8082)

编写一个简单的request

1
2
3
4
5
6
7
8
9
10
11
12
const http = require('http')

let requst = http.request({
hostname: '127.0.0.1', // 发布服务器的host
port: 8082
}, response => {
console.log(response)

})

// http是一个流式数据的写入方式
requst.end() // 发出请求

node.js 的流

node.js stream 官方文档

流主要可以分成两个部分

  1. 可读的流 readable

    1. 'close' 事件

      • 当流或其底层资源(比如文件描述符)被关闭时触发 'close' 事件。 该事件表明不会再触发其他事件,也不会再发生操作。 2. 'data' 事件
      • 当流将数据块传送给消费者后触发。
      • 对于一个流来说,接收某个文件流时是逐步的读取这个文件的数据出来的,根据流的定义,我们不关心这个文件每次读取了多少出来,所以data可能会被一次或者多次的调用
    2. 'end' 事件

      • 'end' 事件只有在数据被完全消费掉后才会触发。
  2. 可写的流 writeable

    1. write() 写入数据到流,并在数据被完全处理之后调用 callback。 如果发生错误,则 callback 可能被调用也可能不被调用。 为了可靠地检测错误,可以为 'error' 事件添加监听器。 callback 会在触发 'error' 之前被异步地调用。

发送文件到服务

1
2
3
4
5
6
7
8
9
10
11
const fs = require('fs')

let file = fs.createReadStream('./package.json')

file.on('data', chunk => {
console.log(chunk.toString())
})

file.on('end', chunk => {
console.log('read finished')
})

服务端接收到文件之后写入指定文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const http = require('http')
const fs = require('fs')


http.createServer(function(requst, response) {
console.log(requst.headers)

let outFile = fs.createWriteStream('./index.html')
requst.on('data', chunk => {
outFile.write(chunk)
})

requst.on('end', chunk => {
outFile.end()
response.end('success')

})

}).listen(8082)

扩展

  1. 将server 改装成一个服务系统,用于接收和写入文件即是一个完整的发布服务。
  2. 当前只写到传输一个指定文件,未扩展写入多个文件/文件夹

to be continued…

以上。