NODE全栈开发

Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时。

读写文件

读取

1
2
3
4
5
let fs = require('fs')

fs.readFile('temp.md', (err, data) => {
console.log(data.toString())
})

写入

1
2
3
4
fs.writeFile('testNew.txt', 'hehe', (err) => {
if (err) console.error(err)
// read('testNew.txt')
})

创建http服务

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

// 创建服务器
let server = http.createServer()

//处理请求事件
server.on('request', () => {
console.log('--收到客户端发起的请求', new Date())
})

// 启动服务器,监听端口
server.listen(2333, () => {
console.log('服务器已启动:http://127.0.0.1:2333/')
})

响应请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
request() {
// 处理请求
this.server.on('request', (request, response) => {
console.log('GET | ', new Date('2019/03/09 00:00:00'))
console.log('PATH:', request.url)
// 获取URL参数
if (request.url.match(/\?/)) {
console.log('DATA: ', request.url.split('?')[1])
this.value = request.url.split('?')[1]
}
response.write(this.template(request.url.split('?')[1]))
response.end()
})
}

允许跨域

1
2
3
4
5
6
// 处理跨域
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Headers", "X-Requested-With");
response.setHeader("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
response.setHeader("X-Powered-By", ' 3.2.1');
response.setHeader("Content-Type", "text/html");

模块

核心模块

可以直接require()的模块

  • fs 文件操作
  • http 服务器构建
  • path 路径操作
  • os 操作系统

自定义模块

1
require('./plugin')

模块作用域

没有全局作用域,只有模块作用域

模块通信

1
2
3
4
//输入
let pluginData = require('./plugin.js')
//输出
exports.pluginData = {'xixi'}

IP 和端口

IP 用来定位计算机,端口进一步定位该计算机内的程序

编码方式

1
response.setHeader("Content-Type", "text/html; charset=utf-8");

返回页面

1
2
3
4
5
6
7
8
9
10
11
request(){
//...
this.readTemp('index.html', response)
//...
}

readTemp(e, response) {
this.fs.readFile('source/' + e, (err, data) => {
response.end(data.toString())
})
}

资源类型

类型查询

POST 请求跨域

1
response.setHeader("Access-Control-Allow-Headers", "Origin,No-Cache,X-Requested-With,If-Modified-Since,Pragma,Last-Modified,Cache-Control,Expires,Content-Type,Access-Control-Allow-Credentials");

url模块获取参数

1
2
r
console.log(this.url.parse(request.url, true).query)

处理 POST 请求

1
2
3
4
5
6
7
8
9
10
11
12
subItem(req, res) {
let data = ''
req.on('data', (chunk) => {
data += chunk
})
req.on('end', () => {
if (data) {
this.addItem(JSON.parse(data))
}
res.end('请求提交数据接口成功,' + data)
})
}

终端模拟请求

1
curl -X POST http://119.29.130.84:3000

获取执行目录

1
console.log(process.cwd())

运行时交互

1
2
3
4
5
6
7
8
9
10
11
const inquirer = require('inquirer');
const questions = [
{
type: "input",
name: "projectLabel",
message: "请输入专题标示(http://test-xsjdata.xoyo.com/data/event/cpanel/task/list) - "
}
];
inquirer.prompt(questions).then(function (answers) {
console.log(answers);
})

递归创建目录

1
2
3
4
5
6
7
8
9
10
11
mkdirs(dirname, callback) {
fs.exists(dirname, (exists) => {
if (exists) {
callback();
} else {
this.mkdirs(path.dirname(dirname), function () {
fs.mkdir(dirname, callback);
});
}
});
}

完整输出JSON

1
console.log(JSON.stringify(result, null, 2));

异常终止程序

1
process.exit(1)

Path 模块

截取路径

1
let path = path.dirname(value)

截取文件名

1
let path = basename.dirname(value)