1、nodejs
1.1、nodejs特性:事件驱动、非阻塞IO模型(异步操作)
1.2、nodejs能做什么
nodejs:既不是语言,也不是框架,它是平台
1.3、读写文件、获取文件信息
var fs = require('fs')
/*
第一个参数表示文件路径
第二个参数表示回调函数
成功:
data:数据
error:null
失败:
data:undefined
error:错误对象
*/
fs.readFile('文件绝对路径', function(error, data){
//console.log(data)
console.log(data.toString())
})
var fs = require('fs')
/*
第一个参数是:文件路径
第二个参数是:文件内容
第三个参数是:回调函数
error:成功为null
失败为错误对象
*/
fs.writeFile('写入文件路径', '大家好啊', function(error){
console.log("写入成功。。。")
})
var fs = require('fs')
fs.stat('./data/sample.txt', function (err, stat) {
if (err) {
console.log(err)
} else {
//是否是文件
console.log('isFile: ' + stat.isFile());
// 是否是目录:
console.log('isDirectory: ' + stat.isDirectory());
if (stat.isFile()) {
// 文件大小:
console.log('size: ' + stat.size);
// 创建时间, Date对象:
console.log('birth time: ' + stat.birthtime);
// 修改时间, Date对象:
console.log('modified time: ' + stat.mtime);
}
}
})
// `结果`
isFile: true
isDirectory: false
size: 287
birth time: Thu Mar 18 2021 14:29:19 GMT+0800 (中国标准时间)
modified time: Thu Mar 18 2021 14:33:03 GMT+0800 (中国标准时间)
1.4、构建服务器
node中核心模块:http
/*
node能够非常轻松的构建一个web服务器
node提供一个核心模块:http
帮助你创建编写服务器
*/
//加载模块
var http = require('http')
//1、使用http.createServer方法创建web服务器,返回一个server实例
var server = http.createServer()
//服务器:提供服务,读数据进行服务
//2、注册、监听request请求事件
/*
当客户端请求过来时,就会触发服务器的request请求事件,
然后执行第二个参数:回调处理
request:请求对象,可以用来获取客户端的一些请求信息,例如请求路径
response:响应对象,可以用来给客户端发送响应消息
*/
server.on('request', function(request, response){
console.log("收到客户端请求, 请求路径:"+request.url)
/*
response对象有一个方法:write可以用来给客户发送响应数据
write可以使用多次,最后一定要是有end结束
*/
//response.write("hello")
//response.end()
//上面方式比较繁琐,不建议使用
// res.setHeader('Content-Type', 'text/plain; charset=utf-8')
response.end("hello nodejs")
//rquest.url获取是端口号3000之后路径
//更具不同请求路径发送不同请求结果
//
//JSON.parse('[]')====[]
//JSON.stringify([])==='[]'
})
//3、绑定端口号,启动服务
server.listen(3000, function(){
console.log("服务器启动成功,通过http://127.0.0.1:3000/进行访问 ")
})
★★
//解决中文输入乱码问题,正确告诉浏览器我们发送内容的编码
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
res.end("kaishi 路径:"+req.url)
每个模块(js文件)中都提供了一个对象:export
将需要被外部访问的成员通过挂载在export上
var foo
export.foo = 10
一些核心模块:(使用之前必须使用“require”加载)
1.5 控制条件分支
等效False的有:false、undefined、null、0、NaN、空字符串("")
其它值都将被视为True
空数组[ ], 空对象{ }等效true
, 与python不同
var a = '' # false, undefined, null, 0, NaN
if (a) {
console.log('yes')
}else{
console.log('not')
}
1.5 以流形式读写文件——Stream
data
事件表示流的数据已经可以读取了,end
事件表示这个流已经到末尾了,没有数据可以读取了,error
事件表示出错了。
//文件流读取文件内容
var rs = fs.createReadStream(dataPath, 'utf-8');
rs.on('data', function (chunk) {
console.log('Data: \n' + chunk)
})
rs.on('end', function () {
console.log('End')
})
rs.on('error', function (err) {
console.log('Error: ' + err)
})
要以流的形式写入文件,只需要不断调用write()
方法,最后以end()
结束:
//以流形式写入文件
var ws = fs.createWriteStream('./data/sample2.txt', 'utf-8');
for (let i = 0; i < 10; i++) {
ws.write('使用stream写入文件。。。。\n' + i);
}
ws.write('End');
//必须以end()结束
ws.end()
·pipe
·
就像可以把两个水管串成一个更长的水管一样,两个流也可以串起来。一个Readable流和一个Writable流串起来后,所有的数据自动从Readable流进入Writable流,这种操作叫pipe。
在Node.js中,Readable流有一个pipe()
方法,就是用来干这件事的。
让我们用pipe()
把一个文件流和另一个文件流串起来,这样源文件的所有数据就自动写入到目标文件里了,所以,这实际上是一个复制文件的程序:
var fs = require('fs')
var dataPath = './data/sample.txt'
var savePath = './data/samples.txt'
//查看文件信息
function fstat(dataPath){
fs.stat(dataPath, function (err, stat) {
if (err) {
console.log(err)
return;
}
//是否是文件
console.log('isFile: ' + stat.isFile());
// 是否是目录:
console.log('isDirectory: ' + stat.isDirectory());
if (stat.isFile()) {
// 文件大小:
console.log('size: ' + stat.size);
// 创建时间, Date对象:
console.log('birth time: ' + stat.birthtime);
// 修改时间, Date对象:
console.log('modified time: ' + stat.mtime);
}
})
}
fstat(dataPath)
//文件流读取文件内容
async function copyFile(from, to) {
var rs = fs.createReadStream(from);
var ws = fs.createWriteStream(to)
console.log('文件复制中')
await rs.pipe(ws)
ws.on('finish', () => {
console.log('文件复制完成。');
//查看写完后文件大小
fstat(savePath)
})
}
copyFile(dataPath, savePath).catch(e => console.log('出错了:'+e));
//fstat(savePath)