02/18/2020
NodeJS
参考资料
基础
npm安装
npm install npm -g
npm install express
npm install fs
npm install events
-g表示全局下载,没有表示下载到本地文件夹
初始化package.json
npm init
创建package.json 文件
{
"name": "hello",
"version": "1.0.0",
"description": "",
"main": "index.js", //<-----main 函数
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1" //<---- 脚本,npm run test 等于执行 echo \"Error: no test specified\" && exit 1
},
"author": "",
"license": "ISC",
"dependencies": { //<----模块
"events": "^3.2.0"
}
}
导入模块
var events = require('events'); #原生模块
var fs = require('fs')
var hello = require('./hello.js') #相对路径的文件模块
回调函数
非阻塞I/O代码
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("程序执行结束!");
>程序执行结束!
>输出data
事件驱动程序–观察者模式
绑定/注册事件 On/AddListener
var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener1', arg1, arg2);
});
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener2', arg1, arg2);
});
- 提问:on和AddListener的区别?
触发事件 Emit
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');
Web模块
使用http模块快速搭建服务端和客户端
服务端
var http = require('http');
var fs = require('fs');
var url = require('url');
// 创建服务器
http.createServer( function (request, response) {
// 解析请求,包括文件名
var pathname = url.parse(request.url).pathname; //获取网址信息 127.0.0.1:8080/index.html --> /index.html
// 输出请求的文件名
console.log("Request for " + pathname + " received.");
// 从文件系统中读取请求的文件内容
fs.readFile(pathname.substr(1), function (err, data) {
if (err) {
console.log(err);
// HTTP 状态码: 404 : NOT FOUND
// Content Type: text/html
response.writeHead(404, {'Content-Type': 'text/html'});
}else{
// HTTP 状态码: 200 : OK
// Content Type: text/html
response.writeHead(200, {'Content-Type': 'text/html'});
// 响应文件内容
response.write(data.toString());
}
// 发送响应数据
response.end();
});
}).listen(8080);
// 控制台会输出以下信息
console.log('Server running at http://127.0.0.1:8080/');
- 页面展示
- 提供数据库信息
客户端
var http = require('http');
// 用于请求的选项
var options = {
host: 'localhost',
port: '8080',
path: '/index.html'
};
// 处理响应的回调函数
var callback = function(response){
// 不断更新数据
var body = '';
response.on('data', function(data) {
body += data;
});
response.on('end', function() {
// 数据接收完成
console.log(body);
});
}
// 向服务端发送请求,并且打印网址内容到cmd中
var req = http.request(options, callback);
req.end();
Express模块
Express 框架核心特性:
-
可以设置中间件来响应 HTTP 请求。
-
定义了路由表用于执行不同的 HTTP 请求动作。
-
可以通过向模板传递参数来动态渲染 HTML 页面。
//express_demo.js 文件
var express = require('express');
var app = express();
//app.get 访问GET路径
app.get('/', function (req, res) {
res.send('Hello World'); //然后返回hello world到页面中
})
//监听8081端口
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
请求和响应
app.get('/', function (req, res) {
// --
})
- request对象表示HTTP请求,获取信息,比如路径,协议,URL等等
- response对象表示TTP响应,即回复,接收到上述请求向客户端发送相关数据
例子1:GET
<html>
<body>
<form action="http://127.0.0.1:8081/process_get" method="GET">
First Name: <input type="text" name="first_name"> <br>
Last Name: <input type="text" name="last_name">
<input type="submit" value="Submit">
</form>
</body>
</html>
表单将会以GET形式发出,即http://127.0.0.1:8081/process_get?first_name=Qixiang&last_name=Liu,发送到process_get网址
//server.js
var express = require('express');
var app = express();
app.use('/public', express.static('public'));
app.get('/index.html', function (req, res) {
res.sendFile( __dirname + "/" + "index.html" ); //返回
})
app.get('/process_get', function (req, res) {
// 输出 JSON 格式,获取URL中键值对 first_name=XXX
var response = {
"first_name":req.query.first_name,
"last_name":req.query.last_name
};
console.log(response);
res.end(JSON.stringify(response)); //结束并且写入值到页面上去
})
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
例子2:POST
URL中不显示信息
http://127.0.0.1:8081/process_get
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
// 创建 application/x-www-form-urlencoded 编码解析
var urlencodedParser = bodyParser.urlencoded({ extended: false }) //解析
app.get('/index.html', function (req, res) {
res.sendFile( __dirname + "/" + "index.html" );
})
app.post('/process_post', urlencodedParser, function (req, res) {
// 输出 JSON 格式
var response = {
"first_name":req.body.first_name, //获取文本body中的first_name
"last_name":req.body.last_name
};
console.log(response);
res.end(JSON.stringify(response));
})
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})