Node.js简单笔记

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):返回路径中文件的后缀名,即路径中最后一个'.'之后的部分。如果一个路径中并不包含'.'或该路径只包含一个'.' 且这个'.'为路径的第一个字符,则此命令返回空字符串。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值