NodeJs基础
概念
它是一个运行在服务端的JavaScirpt平台,基于Chrome浏览器在运行时创建的一个平台,基于Chrome浏览器在运行时创建的一个平台,基于google的v8引擎的,速度非常的快,性能好,它可以处理大量的并发。nodeJs可以接收好几种文件类型,nodeJs,它可以提供http服务,IIS、Apache类似,都是http的服务,node需要手动的进行一些配置
dos命令
? --cls,清空控制台屏幕
? --dir,列出当前目录中的文件和目录
事件机制
nodeJs当中,基本上所有的事件机制,都是基于观察者模式。
在JavaScript当中存在着一个事件队列,这个东西只是在内存当中的,看不到,操作不了,nodeJs在异步操作的完成的时候,会发一个事件,到事件队列。当请求完成时,会把结果返回给用户。
Node模块
-----核心模块, nodeJs内置的;
? 核心模块在运行的时候,被编译为二进制的流了,
----自定义的模块…
nodeJs要做一些工作,都需要加载各种模块
? 这个在运行的时候,有一个编译、寻址的过程, 所以它的速度,会比核心模块慢。
http模块
它要创建http服务也是一样,它需要http模块。
require 指令,它用来载入各种模块;
使用 http.createServer(),创建服务
.listen(),监听服务的端口号,但是一般不要使用 8080,因为许多其它的服务都会默认使用它
发送http请求,就是访问某个网址,本地服务器地址:http://localhost:端口号或者http://127.0.0.1:5874
端口号:四位数字,
,ctrl + c,快速的停止node的服务
Content-Type
? text/plain,纯文本;
? text/html,html的文本;
var http1 = require('http');
http1.createServer(function(request, response) {
response.writeHead(200, { 'Content-Type': 'text/html;charset=utf8' });
response.end('<h1>第一个服务</h1>');
}).listen(8888);
console.log('8888,server is running');
fs模块
fs模块,nodeJs的文件系统,fileSystem
var fs = require('fs');
fs.readFile('file.txt', function(err, _data) {
console.log(_data.toString());
})
console.log('程序结束了,这里是异步输出的');
综合写法
var http1 = require('http');
var fs = require('fs');
http1.createServer(function(request, response) {
response.writeHead(200, { 'Content-Type': 'text/html;charset=utf8' });
fs.readFile('file.txt', function(err, _data) {
response.end(_data.toString());
})
}).listen(8888);
console.log('8888,server is running');
同步
同步 sync [s??k],是阻塞的;是按顺序执行的;
异步
nodeJs,它是异步编程。异步编程它就是依托于回调来实现的。nodejs它大量的使用了回调函数,这样在代码执行的时候,就没有阻塞或是等待什么的,提高了效率,可以处理大量的并发请求。
异步,是非阻塞的;是不按顺序执行的。它不用等待,所以提高性能
线程
nodejs它是单线程、单进程的应用程序,
单线程,node的fs模块读取文件,它有同步、异步,同步会有阻塞,那这个阻塞就是单线程
Node事件
在nodeJs当中,所有事件产生的对象,events模块,
在events模块里面有一个对象,events.EventEmitter,EventEmitter的核心,是事件的触发与监听功能的封装。在具体使用的时候,还是require(‘events’),
on函数,用于绑定事件;
emit,用于触发事件;
var event = require('events');
var emitter = new event.EventEmitter();
emitter.on('aaa', function() {
console.log('111111')
emitter.emit('ccc');
});
emitter.on('bbb', function() {
console.log('22222222')
setTimeout(function() {
emitter.emit('ddd');
}, 2000)
});
emitter.on('ccc', function() {
console.log('33333');
emitter.emit('bbb');
});
emitter.on('ddd', function() {
console.log('444444')
});
emitter.emit('aaa');
Buffer 缓冲区
缓冲区,其实就是内存。JavaScript语言,它本身不能操作内存。js它只有处理字符串类型的数据,它不能处理二进制类型的数据。
nodejs它要响应http的请求,处理tcp的流或是文件流的,必须要使用到二进制的数据,所以在nodeJs当中,就定义了一个Buffer类,它用来创建、操作一个存放二进制数据的缓存区。
随着node核心库一起安装的,所以连require都不用写,
alloc
.alloc,返回一个指定大小的Buffer实例;写入的超出的部分,不显示
.length,返回Buffer缓冲区的大小;
.toString(),读取缓冲区的内容
.write(),向缓冲区中写入内容
var _buf = Buffer.alloc(10);
_buf.write('132...,我是一二三');
console.log(_buf.toString());
console.log(_buf.length);
var _buf = Buffer.alloc(26);
for (var i = 0; i < 26; i++) {
_buf[i] = i + 97;
}
console.log(_buf.toString())
Stream,流
node中抽象接口,很多对象都实现了它的功能。
Stream流,有四种类型,
? -Readable 读,
? -Writable 写,
? -Duplex 可读可写,
? -Transform 被写入之后,读出结果
Stream,同时它也是 EventEmitter 的实例,
? -data, 有数据可读时
? -end, 没有更多数据可读时
? -error, 报错时
? -finish, 所有数据已经被写入时
var fs = require('fs');
var _data = '';
var readStream = fs.createReadStream('readStream.txt');
readStream.setEncoding('utf-8');
readStream.on('data', function(_d) {
_data += _d;
})
readStream.on('end', function(_d) {
console.log(_data);
})
readStream.on('error', function(err) {
console.log(err)
})
var fs = require('fs');
var _data = '这是要被写入的内容';
var writeStream = fs.createWriteStream('write_text.txt');
writeStream.write(_data, 'utf-8');
writeStream.on('finish', function() {
console.log('全部数据写入完成');
})
writeStream.on('error', function(err) {
console.log(err)
});
console.log('写入完成xxx');
管道流
它提供了一个从输出流,到输入流的机制。通常是用于从一个流当中获得数据,并将数据传递到另一个流当中。
var fs = require('fs');
var readStream = fs.createReadStream('aaa.txt');
var writeStream = fs.createWriteStream('bbb.txt');
readStream.pipe(writeStream);
console.log('执行完成');
var fs = require('fs');
var zlib = require('zlib');
fs.createReadStream('aaa.txt').pipe(zlib.createGzip()).pipe(fs.createWriteStream('aaa.txt.gz'))
console.log('压缩完成');
var fs = require('fs');
var zlib = require('zlib');
fs.createReadStream('aaa.txt.gz').pipe(zlib.createGunzip()).pipe(fs.createWriteStream('ccc.txt'))
console.log('解压完成');
链式流
.pipe(),主要是这个方法,它是一个可以链式操作的方法,也就是说,可以多个.pipe()方法连起来使用。
node的模块系统
node.js在模块这个部分,有二个对象,
? - exports,导出模块,它是模块对外公开的接口,
? - require,引入模块,从外部艾玛一个模块的接口,
自定义的模块,要写路径, ./ 是根目录
module,将整个模块,全部导出
// 引入模块 require中写的是路径
var b = require('./b');
var c = require('./c')
var mod = require('./module_obj')
b.xxfn();
c.ccFn('这里是c模块');
// 首先要创建实例
var _m = new mod();
console.log(_m.a);
_m.b('这里是将整个模块全部导出')
exports.xxfn = function() {
console.log('b模块的导出')
}
exports.ccFn = function(_n) {
console.log(_n)
}
function Fnobj() {
this.a = 123;
this.b = function(_obj) {
console.log(_obj)
}
}
module.exports = Fnobj;
nodeJs的 get
浏览器地址栏的url,就是一个get请求的。https://www.baidu.com/s?ie=UTF-8&wd=baidu
get请求的参数是,url的?号后面的东西?ie=UTF-8&wd=baidu
new URL,用于解析相对、绝对的路径
.searchParams,查询url的参数
Iterator,它不是一种新的数据结构,
js有数组、Object,es6又有了map、set,这么多的数据结构,就需要一种统一的访问机制,这个统一的访问机制,就是Iterator。如果要遍历Iterator,就需要 for of循环,别的不行,如果是Iterator的对象,就需要用for of循环.
var http = require('http');
http.createServer(function(req, res) {
if (req.headers.referer != undefined) {
var myUrl = new URL(req.headers.referer);
console.log(myUrl.searchParams.keys());
var _k = myUrl.searchParams.keys();
for (var i of _k) {
console.log(i);
}
console.log(myUrl.searchParams.values());
var _v = myUrl.searchParams.values();
for (var i of _v) {
console.log(i);
}
console.log(myUrl.searchParams.entries())
var _e = myUrl.searchParams.entries();
for (var i of _e) {
console.log(i[0] + '/' + i[1])
}
}
res.end();
}).listen(8888, function() {
console.log('server is running');
})
POST
POST一般通过表单来发起post请求,把表单的数据在后台发送给服务器。
var http = require('http');
var querystring = require('querystring')
var _htmlText = `
<form method="POST">
<div>
<label for="uname">姓名:</label>
<input type="text" name="username" id="uname">
</div>
<div>
<label for="uage">年龄:</label>
<input type="text" name="age" id="uage">
</div>
<div>
<input type="submit" value="提交">
</div>
</form>
`
http.createServer(function(req, res) {
if (req.url != '/favicon.ico') {
res.writeHead(200, { 'Content-Type': 'text/html;charset=utf8' })
var _data = '';
req.on('data', function(_d) {
_data += _d;
})
req.on('end', function() {
var _obj = JSON.stringify(querystring.parse(_data));
_data = JSON.parse(_obj)
console.log(_data);
if (_data.username) {
res.write(`姓名:${_data.username}<br/>年龄:${_data.age}`)
} else {
res.write(_htmlText);
}
res.end();
})
}
}).listen(8888, function() {
console.log('8888,server is running')
})
|