1.什么是Node.js
Node.js是一个JavaScript运行时环境,用来解析和执行JavaScript.在Node.js中的JavaScript没有BOM和DOM,只有EcmaScript。它为JavaScript提供了一些服务器级别的操作API(文件读写、网络服务构建、网络通信、Http服务器、...)
Node.js的特性:
1.事件驱动
2.非阻塞IO模型(异步通信)
3.轻量和高效
2.Node.js能做什么
1.Web服务器后台
2.命令行工具
在Node中没有全局作用域,只有模块作用域(即文件作用域)
node获取当前路径的三种方法
1.__dirname:返回被执行的js文件所在文件夹的绝对路径
console.log(__dirname)
1.5__filename: 总是返回被执行的 js 文件的绝对路径
console.log(__filename)
2.resolve('./'):当前命令所在的目录
console.log(resolve('./'))
3.process.cwd():总是返回运行 node 命令时所在的文件夹的绝对路径
console.log(process.cwd())
3.使用Node.js执行js脚本文件
在终端命令行中,定位js脚本文件的目录,通过node 脚本文件名.js
注意:文件名不能使用Node、中文;
核心模块
Node为JavaScript提供了很多服务器级别的API,这些API巨大多数都被包装到了一个具名的核心模块中.如:
1.文件操作核心模块fs
2.http服务构建核心模块http
3.路径操作核心模块path
4.操作系统信息模块os
5.地址服务核心模块url
6.处理操作系统相关的文件路径的核心模块path
...
模块系统-导入与导出
require是一个方法,它的作用是用来加载模块(注意:相对路径必须加 './')和加载文件模块导出(exports导出的对象)的接口对象,在Node中,模块有:
1.具名的核心模块,如:fs、http、os、url、...
2.用户自己编写的文件模块(即js文件)
exports用于导出文件中的成员(只能一个一个导出),然后在另外一个文件中通过require导入使用
在每个文件模块(js文件)中,都存在着一个对象exports,它默认是一个空对象,我们可以通过将文件中的成员(方法、函数、对象、...)挂载到这个空对象名下,从而使得其他文件能够使用这些成员
注意:因为exports是一个对象,所有在使用这个挂载的成员时,需要通过对象的方式使用.
exports.自定义=需要导出的对象名
3.module.exports也是用于导出文件中的成员,然后在另外一个文件中通过require导入使用,但相比较exports,module.exports可以一次导出更多的文件方法、对象、成员...
module.exports={
自定义:需要导出的成员1,
自定义:需要导出的成员2
...
}
注意:在fs文件模块操作中,相对路径可以省略“ ./ ",而在模块加载中,相对路径中的" ./ "不能够省略
node的标准输入输出流
引入核心模块readline,配置相关信息
const readline=require('readline');
const rl=readline.createInterface({
input:process.stdin,
output:process.stdout
});
rl.question(你提出的问题,function(answer){
console.log('回答'+answer);
rl.close();//关闭
})
4.文件的操作
fs是file-system的简写,即文件系统;在Node中如果想要进行文件操作,必须引入fs这个核心模块,在fs这个核心模块中,提供了所有的文件操作相关的API。
引入方式:let fs=require('fs')
注意:读、写文件是异步操作,不能直接在函数内部return,这样是没有接收到返回值,在外部调用就是undefined,我们可以通过Promise方法解决这个问题
1.文件读取
fs.readFile(url,callback(error,data){
url:需要读取的文件所在路径
callback(error,data):回调函数,若读取成功,则data表示返回的数据,error表示null;若读取失败,则data表示undefind,error表示错误提示信息.
注意:默认读取到的是二进制数据,需要通过toString()方法转换;回调函数中的参数顺序必须是(error,data)
})
2.文件写入(注意:写入操作会覆盖原文本内容)
fs.writeFile(url,txt,callback(error){
...
})
url:所需写入文件所在的路径
txt:写入的文件内容
callback(error):回调函数,若写入成功,则error表示null,若写入失败,error表示错误提示信息.
3.文件的删除
fs.unlink(url,function(error){
/*
*url:文件所在路径
function(error):回调函数,若删除成功,则error表示null,若删除失败,则error表示错误提示信息
})
4.读取文件目录
fs.readdir(url,function(error,files){
url:需要读取的目录所在路径
function(error,files):若读取成功,则error表示null,files表示指定目录下所有文件名称的数组集
})
5.创建文件目录
fs.mkdir(url,function(err){
url:指定将要创建目录所在路径
function(err):回调函数,创建成功,则err表示null,若创建失败,则err为错误提示信息(若目录已经存在,则创建失败)
})
6.删除文件目录
fs.rmdir(url,function(err){
url:目录所在路径
function(err):回调函数,删除成功表示null,删除失败表示错误提示信息
})
7.测试某个路径下的文件是否存在。
fs.exists(url,function(exists){
url:文件路径
function(err):回调函数,若存在,则exists为true;若不存在,则exists为false.
})
......
4.5文件流(Stream)
stream是一个抽象接口,Stream有四种流类型:Readable(可读操作)、Writable(可写操作)、Duplex(可读可写操作)、Transform(操作被写入数据,然后读出结果)。所有的Stream对象都是EventEmitter的实例,对于事件的监听用on方法(Stream对象.on('事件类型',回调函数)),常用的事件有:open(当文件打开时触发)、ready(文件准备写入状态,当有open事件时,可以不用)、close(当文件执行完关闭后触发)、data(当有数据可读时触发)、end(没有更多的数据可读时触发)、error(在接收和写入过程中发生错误时触发)、finish(所有数据已被写入到底层系统时触发)
文件流的流出操作:
1.创建读取流实例对象
const rf=fs.createReadStream(文件路径,{可选配置操作})
如:fs.createReadStream(文件路径,{flags:'r'})
2.事件的监听:rf.on('事件类型',回调函数)
open事件,data事件(rf.on('data',function(chunk){
//读取的流文件时单批量获取的,不是一次性读完的
//chunk表示读取到的文件内容(二进制,toString()方法转为字符串)
})),close事件
文件流的流入操作:
1.创建写入流实例对象:const ws=fs.createWriteStream(文件路径,{可选配置操作})
2.事件的监听:ws.on('事件类型',回调函数)
open事件,close事件,error事件
3.文件的写入:ws.write(文件写入的内容,function(err){})
4.结束流程:ws.end(function(){console.log(流操作结束完成)})
管道流的文件操作(将读取到的文件立刻写入到另外一个文件中)
1.创建文件的读取和写入实例对象
const ws=fs.createWriteStream(文件路径,{flags:'w'})
const rs=fs.createReadStream(文件路径,{flags:'r'})
2.监听读取流事件
open事件,data事件,close事件
3.进行管道流
rs.pipe(ws)
5.url核心模块
url模块是用来解析node请求(http请求)中携带的信息,所有我们需要引入url核心模块
const url=require('url');
url.parse(strUrl,boolean,boolean)
strUrl:字符串类型的网络请求地址
boolean:布尔类型,默认为false,当为true时,将strUrl解析对象中的query属性解析为一个对象
boolean:布尔类型,默认为false,当为true时,将strUrl解析对象中的host属性内容解析为一个对象
6.HTTP服务
ip地址用来定位计算机地址,端口号用来定位应用程序。
http是Node中专门进行HTTP请求的核心模块,它的作用是帮助我们创建编写服务器
步骤执行:
1.引入http核心模块
const http=require('http');
2.创建Web服务器
const server=http.createServer();
了解服务器需要干什么
1.提供对数据的服务
2.发送请求
3.接收请求
4.处理请求
5.发送响应
注意:一般我们通过判断resquest.url的值来返回客户端请求的数据
6.注册request请求事件
3.设置服务器响应内容
server.on('request',function(request,response){
参数所具有的方法
1.request.url:获取用户请求的资源路径(可以用来判断客户端请求的方向返回相应的内容)
2.response.setHeader(数据响应内容类型):设置数据响应内容类型(推荐设置:'Content-Type','text/plain;charset=utf-8')
数据响应内容类型:
1.'Content-Type','text/plain;charset=utf-8' :普通文本文件类型
2.'Content-Type','text/html;charset=utf-8' :html文本文件类型(我们若想给客户端发送一个html文件内容,则需要先通过fs模块读取html文件内容,然后再通过http模块server的response.end(响应内容)发送出去)
3.'Content-Type','image/jpeg :响应请求的图片内容,图片不需要设置字符编码
3.response.end(服务器返回的内容):用来设置服务器返回给客户端的数据内容(必须设置)
})
4.设置请求的端口号,启动服务器
server.listen(3000,function(){
console.log('服务器启动成功,可以通过 http://127.0.0.1:3000/ 来进行访问');
});
7.node服务器重定向
原理:浏览器发现状态码为302,然后去请求头Header里找Location,再次对新路径发起请求,进行重定向跳转.
如何通过服务器让客户端重定向?
1.设置状态码为302临时重定向(301为永久重定向)
2.在响应头中通过Location告诉客户端哪里重定向
3.如果客户端发现收到的服务器响应状态码是302,就会自定去响应头中找Location然后对该地址发送请求
4.客户端自动跳转
res.statusCode=302
res.setHeader('Location','/')
res.end()
8.path核心模块
path 模块提供了一些用于处理文件路径的小工具,所以我们需要引入path核心模块
1.path.join(url1,url2,...): 该方法用于连接路径.
2.path.resolve([from ...], to): 该方法将参数to解析为绝对路径,给定的路径的序列是从右往左被处理的,后面每个 path 被依次解析,直到构造完成一个绝对路径。
path.resolve('/foo/bar', './baz');
// 返回: '/foo/bar/baz'
path.resolve('/foo/bar', '/tmp/file/');
// 返回: '/tmp/file'
path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif');
// 如果当前工作目录为 /home/myself/node,
// 则返回 '/home/myself/node/wwwroot/static_files/gif/image.gif'
3.path.relative(from, to): 将绝对路径转为相对路径,返回从 from 到 to 的相对路径(基于当前工作目录)
path.relative('C:\\orandea\\test\\aaa', 'C:\\orandea\\impl\\bbb');
// 返回: '..\\..\\impl\\bbb'
4.path.dirname(p): 返回路径中代表文件夹的部分
5.path.extname(p):返回路径中文件的后缀名,即路径中最后一个'.'之后的部分。如果一个路径中并不包含'.'或该路径只包含一个'.' 且这个'.'为路径的第一个字符,则此命令返回空字符串。