• node.js---基础学习


    安装配置

    下载地址

    x64 windows

    window 64位 msi 文件,安装过程中可以调整安装位置,安装完成以后会在系统的 Path 配置里添加 node 的安装路径。

    验证方法一:安装完成以后,可以通过在命令行中执行path命令,即可查看系统的path值,其中如果有包含node.js的安装路径,安装成功。

    验证方法二:通过在命令行中执行node -v命令即可查看安装好的 Node.js 的版本;也可以通过npm -v来查看npm版本。

    基础了解

    Node.js 应用是由以下部分组成的:

    1. 引入 required 模块:使用 require 指令来载入 Node.js 模块。
    2. 创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。
    3. 接收请求与响应请求 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据

    NPM是随同NodeJS一起安装的包管理工具,能解决 NodeJS 代码部署上的很多问题,常见的使用场景有以下几种:

    • 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
    • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
    • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

    引入 required 模块

    // 引入http模块
    var http = require('http');
    
    // 创建服务器
    http.createServer(function (request, response) {
    
        // 发送 HTTP 头部 
        // HTTP 状态值: 200 : OK
        // 内容类型: text/plain
        response.writeHead(200, {'Content-Type': 'text/plain'});
    
        // 发送响应数据 "Hello World"
        response.end('Hello World
    ');
    }).listen(8888);
    
    // 终端打印如下信息
    console.log('Server running at http://127.0.0.1:8888/');
    

    NPM 的使用

    npm -v 查看npm版本

    npm install npm -g 升级npm版本

    npm install module_name 安装 node 的名为 module_name 的模块到相对路径下

    npm install module_name -g 安装 node 的名为 module_name 的模块到绝对路径下

    npm list -g 查看全局安装的模块

    npm list module_name 查看已安装好的 module_name 的版本号

    npm uninstall module_name 卸载模块

    npm update mudule_name 更新模块

    npm search module_name 搜索模块

    npm init 创建模块

    npm adduser 在 npm 资源库中注册用户

    npm publish 发布模块

    node终端

    使用node命令进入node.js的终端

    node 的语法

    回调函数

    Node.js 异步编程的直接体现就是回调。

    异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。

    回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数

    回调函数一般作为函数的最后一个参数出现:

    function foo1(name, age, callback) { }
    function foo2(value, callback1, callback2) { }
    

    如果需要处理回调函数的参数,我们就需要写在回调函数内。

    事件

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。


    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件

    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);
    // 触发事件
    eventEmitter.emit('eventName');
    

    Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列,Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件…… 所有这些产生事件的对象都是 events.EventEmitter 的实例

    • EventEmitter 的核心就是事件触发与事件监听器功能的封装。

    • 对于每个事件,EventEmitter 支持 若干个事件监听器。当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。

    事件函数

    error 相关事件:

    var events = require('events'); 
    var emitter = new events.EventEmitter(); 
    emitter.emit('error'); 
    

    监听相关事件:

    newListener
    event - 字符串,事件名称;listener - 处理事件函数该事件在添加新监听器时被触发。

    removeListener
    event - 字符串,事件名称;listener - 处理事件函数从指定监听器数组中删除一个监听器。需要注意的是,此操作将会改变处于被删监听器之后的那些监听器的索引。

    • listenerCount(emitter, event)
      返回指定事件的监听器数量。

      events.emitter.listenerCount(eventName)

    • addListener(event, listener)
      为指定事件添加一个监听器到监听器数组的尾部。

    • on(event, listener)
      为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。

    • once(event, listener)
      为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。

    • removeListener(event, listener)

      移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。

      它接受两个参数,第一个是事件名称,第二个是回调函数名称。

    • removeAllListeners([event])
      移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。

    • setMaxListeners(n)
      默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。

    • listeners(event)
      返回指定事件的监听器数组。

    • emit(event, [arg1], [arg2], [...])
      按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false。

    缓冲

    在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区

    每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。


    v6.0之前创建Buffer对象直接使用new Buffer()构造函数来创建对象实例,但是Buffer对内存的权限操作相比很大,可以直接捕获一些敏感信息,所以在v6.0以后,官方文档里面建议使用 Buffer.from() 接口去创建Buffer对象。


    字符编码

    Buffer 实例一般用于表示编码字符的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六进制编码的数据。 通过使用显式的字符编码,就可以在 Buffer 实例与普通的 JavaScript 字符串之间进行相互转换。

    Node.js 目前支持的字符编码包括:

    • ascii - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。
    • utf8 - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。
    • utf16le - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。
    • ucs2 - utf16le 的别名。
    • base64 - Base64 编码。
    • latin1 - 一种把 Buffer 编码成一字节编码的字符串的方式。
    • binary - latin1 的别名。
    • hex - 将每个字节编码为两个十六进制字符。

    创建 Buffer 类

    Buffer 提供了以下 API 来创建 Buffer 类:

    • Buffer.alloc(size[, fill[, encoding]]): 返回一个指定大小的 Buffer 实例,如果没有设置 fill,则默认填满 0
    • Buffer.allocUnsafe(size): 返回一个指定大小的 Buffer 实例,但是它不会被初始化,所以它可能包含敏感的数据
    • Buffer.allocUnsafeSlow(size)
    • Buffer.from(array): 返回一个被 array 的值初始化的新的 Buffer 实例(传入的 array 的元素只能是数字,不然就会自动被 0 覆盖)
    • Buffer.from(arrayBuffer[, byteOffset[, length]]): 返回一个新建的与给定的 ArrayBuffer 共享同一内存的 Buffer。
    • Buffer.from(buffer): 复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例
    • Buffer.from(string[, encoding]): 返回一个被 string 的值初始化的新的 Buffer 实例
    // 创建一个长度为 10、且用 0 填充的 Buffer。
    const buf1 = Buffer.alloc(10);
    
    // 创建一个长度为 10、且用 0x1 填充的 Buffer。 
    const buf2 = Buffer.alloc(10, 1);
    
    // 创建一个长度为 10、且未初始化的 Buffer。
    // 这个方法比调用 Buffer.alloc() 更快,
    // 但返回的 Buffer 实例可能包含旧数据,
    // 因此需要使用 fill() 或 write() 重写。
    const buf3 = Buffer.allocUnsafe(10);
    
    // 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
    const buf4 = Buffer.from([1, 2, 3]);
    
    // 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
    const buf5 = Buffer.from('tést');
    
    // 创建一个包含 Latin-1 字节 [0x74, 0xe9, 0x73, 0x74] 的 Buffer。
    const buf6 = Buffer.from('tést', 'latin1');
    

    语法函数

    • 写入缓冲区

      // string - 写入缓冲区的字符串。
      // offset - 缓冲区开始写入的索引值,默认为 0 。
      // length - 写入的字节数,默认为 buffer.length
      // encoding - 使用的编码。默认为 'utf8' 。
      // 返回实际写入的大小。如果 buffer 空间不足, 则只会写入部分字符串。
      buf.write(string[, offset[, length]][, encoding])
      // 使用指定的 value 来填充这个 buffer。如果没有指定 offset (默认是 0) 并且 end (默认是 buffer.length) ,将会填充整个buffer。
      buf.fill(value[, offset][, end])
      
    • 读取数据

      // encoding - 使用的编码。默认为 'utf8' 。
      // start - 指定开始读取的索引位置,默认为 0。
      // end - 结束位置,默认为缓冲区的末尾。
      // 返回值:解码缓冲区数据并使用指定的编码返回字符串。
      buf.toString([encoding[, start[, end]]])
      
    • 转换成 json 数据

      // 返回 json 对象
      buf.toJSON()
      // 实例
      const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
      const json = JSON.stringify(buf);
      
      // 输出: {"type":"Buffer","data":[1,2,3,4,5]}
      console.log(json);
      
      const copy = JSON.parse(json, (key, value) => {
        return value && value.type === 'Buffer' ?
          Buffer.from(value.data) :
          value;
      });
      
      // 输出: <Buffer 01 02 03 04 05>
      console.log(copy);
      
    • 合并缓冲区

      // list - 用于合并的 Buffer 对象数组列表。
      // totalLength - 指定合并后Buffer对象的总长度。
      // 一个多个成员合并的新 Buffer 对象。
      Buffer.concat(list[, totalLength])
      
    • 比较缓冲区

      // otherBuffer - 与 buf 对象比较的另外一个 Buffer 对象。
      // 返回一个数字,表示 buf 在 otherBuffer 之前(<0)、之后(>0)或相同(=0)。
      buf.compare(otherBuffer);
      // 比较两个缓冲区是否相等,如果是返回 true,否则返回 false。
      buf.equals(otherBuffer)
      
    • 拷贝缓冲区

      // targetBuffer - 要拷贝的 Buffer 对象。
      // targetStart - 数字, 可选, 默认: 0
      // sourceStart - 数字, 可选, 默认: 0
      // sourceEnd - 数字, 可选, 默认: buffer.length
      // 无返回值
      buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
      
    • 裁剪缓冲区

      // start - 数字, 可选, 默认: 0
      // end - 数字, 可选, 默认: buffer.length
      // 返回一个新的缓冲区,它和旧缓冲区指向同一块内存,但是从索引 start 到 end 的位置剪切
      buf.slice([start[, end]])
      
    • 缓冲区长度

      //  Buffer 对象所占据的内存长度。
      buf.length;
      
    • 获取或设置指定的字节

      buf[index]

      返回值代表一个字节,所以返回值的合法范围是十六进制0x00到0xFF 或者十进制0至 255。

    Stream 是一个抽象接口,Node 中有很多对象实现了这个接口

    Stream 有四种流类型

    • Readable - 可读操作。
    • Writable - 可写操作。
    • Duplex - 可读可写操作.
    • Transform - 操作被写入数据,然后读出结果。

    所有的 Stream 对象都是 EventEmitter 的实例,常用的事件有:

    • data - 当有数据可读时触发。
    • end - 没有更多的数据可读时触发。
    • error - 在接收和写入过程中发生错误时触发。
    • finish - 所有数据已被写入到底层系统时触发。

    语法函数

    • 读取

      var fs = require("fs");
      var data = '';
      
      // 创建可读流
      var readerStream = fs.createReadStream('input.txt');
      // 设置编码为 utf8。
      readerStream.setEncoding('UTF8');
      
    • 写入

      var fs = require("fs");
      var data = 'sdfads';
      
      // 创建一个可以写入的流,写入到文件 output.txt 中
      var writerStream = fs.createWriteStream('output.txt');
      // 使用 utf8 编码写入数据
      writerStream.write(data,'UTF8');
      // 标记文件末尾
      writerStream.end();
      
    • 管道流

      从一个流中获取数据并将数据传递到另外一个流中。

      var fs = require("fs");
      
      // 创建一个可读流
      var readerStream = fs.createReadStream('input.txt');
      
      // 创建一个可写流
      var writerStream = fs.createWriteStream('output.txt');
      
      // 管道读写操作
      // 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
      readerStream.pipe(writerStream);
      
    • 链式流

      通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作。

      可以用管道和链式来压缩和解压文件。

      // 文件压缩
      var fs = require("fs");
      var zlib = require('zlib');
      
      // 压缩 input.txt 文件为 input.txt.gz
      fs.createReadStream('input.txt')
        .pipe(zlib.createGzip())
        .pipe(fs.createWriteStream('input.txt.gz'));
      
      // 文件解压
      var fs = require("fs");
      var zlib = require('zlib');
      
      // 解压 input.txt.gz 文件为 input.txt
      fs.createReadStream('input.txt.gz')
        .pipe(zlib.createGunzip())
        .pipe(fs.createWriteStream('input.txt'));
      

    模块

    语法函数

    // 引入了当前目录下的 hello.js 文件
    var hello = require('./hello');
    hello.world();
    // hello.js 使用 node.js 中的 export 对象定义外部可以访问的 world()函数
    exports.world = function() {
      console.log('Hello World');
    }
    // 或者使用以下方法,将函数暴露为对象
    module.exports = function() {
      // ...
    }
    

    加载顺序

    文件模块缓冲区 ==> 原生模块 ==> 文件模块

    1. 如果 X 是内置模块
       a. 返回内置模块
       b. 停止执行
    2. 如果 X 以 '/' 开头
       a. 设置 Y 为文件根路径
    3. 如果 X 以 './' 或 '/' or '../' 开头
       a. LOAD_AS_FILE(Y + X)
       b. LOAD_AS_DIRECTORY(Y + X)
    4. LOAD_NODE_MODULES(X, dirname(Y))
    5. 抛出异常 "not found"
    
    LOAD_AS_FILE(X)
    1. 如果 X 是一个文件, 将 X 作为 JavaScript 文本载入并停止执行。
    2. 如果 X.js 是一个文件, 将 X.js 作为 JavaScript 文本载入并停止执行。
    3. 如果 X.json 是一个文件, 解析 X.json 为 JavaScript 对象并停止执行。
    4. 如果 X.node 是一个文件, 将 X.node 作为二进制插件载入并停止执行。
    
    LOAD_INDEX(X)
    1. 如果 X/index.js 是一个文件,  将 X/index.js 作为 JavaScript 文本载入并停止执行。
    2. 如果 X/index.json 是一个文件, 解析 X/index.json 为 JavaScript 对象并停止执行。
    3. 如果 X/index.node 是一个文件,  将 X/index.node 作为二进制插件载入并停止执行。
    
    LOAD_AS_DIRECTORY(X)
    1. 如果 X/package.json 是一个文件,
       a. 解析 X/package.json, 并查找 "main" 字段。
       b. let M = X + (json main 字段)
       c. LOAD_AS_FILE(M)
       d. LOAD_INDEX(M)
    2. LOAD_INDEX(X)
    
    LOAD_NODE_MODULES(X, START)
    1. let DIRS=NODE_MODULES_PATHS(START)
    2. for each DIR in DIRS:
       a. LOAD_AS_FILE(DIR/X)
       b. LOAD_AS_DIRECTORY(DIR/X)
    
    NODE_MODULES_PATHS(START)
    1. let PARTS = path split(START)
    2. let I = count of PARTS - 1
    3. let DIRS = []
    4. while I >= 0,
       a. if PARTS[I] = "node_modules" CONTINUE
       b. DIR = path join(PARTS[0 .. I] + "node_modules")
       c. DIRS = DIRS + DIR
       d. let I = I - 1
    5. return DIRS
    

    解析request.url

    所有数据都包含在 request 对象中,该对象作为 onRequest() 回调函数的第一个参数传递。

    http://localhost:8888/start?foo=bar&hello=world

    • url.parse(string).pathname start
    • url.parse(string).query foo=bar&hello=world
    • querystring.parse(querystring)["foo"] bar
    • querystring.parse(querystring)["hello"] world

    全局变量

    __filename

    __filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。 如果在模块中,返回的值是模块文件的路径。

    __dirname

    __dirname 表示当前执行脚本所在的目录。

    setTimeout(cb, ms)

    setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。:setTimeout() 只执行一次指定函数。

    返回一个代表定时器的句柄值。

    clearTimeout(t)

    clearTimeout( t ) 全局函数用于停止一个之前通过 setTimeout() 创建的定时器。 参数 t 是通过 setTimeout() 函数创建的定时器。

    setInterval(cb, ms)

    setInterval(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。

    返回一个代表定时器的句柄值。可以使用 clearInterval(t) 函数来清除定时器。

    setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。

    console

    console 用于提供控制台标准输出。

    • console.log()

      向标准输出流打印字符并以换行符结束。该方法接收若干 个参数,如果只有一个参数,则输出这个参数的字符串形式。如果有多个参数,则 以类似于C 语言 printf() 命令的格式输出。

    • console.warn()

      输出警告消息。控制台出现有黄色的惊叹号。

    • console.info()

      该命令的作用是返回信息性消息,这个命令与console.log差别并不大,除了在chrome中只会输出文字外,其余的会显示一个蓝色的惊叹号。

    • console.error()

      输出错误消息的。控制台在出现错误时会显示是红色的叉子。

    • console.dir()

      用来对一个对象进行检查(inspect),并以易于阅读和打印的格式显示。

    • console.time("")

      输出时间,表示计时开始。

    • console.timeEnd("")

      结束时间,表示计时结束。

    • console.trace()

      当前执行的代码在堆栈中的调用路径,这个测试函数运行很有帮助,只要给想测试的函数里面加入 console.trace 就行了。

    • console.assert()

      用于判断某个表达式或变量是否为真,接收两个参数,第一个参数是表达式,第二个参数是字符串。只有当第一个参数为false,才会输出第二个参数,否则不会有任何结果。

    process

    process 是一个全局变量,即 global 对象的属性。它用于描述当前Node.js 进程状态的对象,提供了一个与操作系统的简单接口。

    • exit

      当进程准备退出时触发。

    • beforeExit

      当 node 清空事件循环,并且没有其他安排时触发这个事件。通常来说,当没有进程安排时 node 退出,但是 'beforeExit' 的监听器可以异步调用,这样 node 就会继续执行。

    • uncaughtException

      当一个异常冒泡回到事件循环,触发这个事件。如果给异常添加了监视器,默认的操作(打印堆栈跟踪信息并退出)就不会发生。

    • Signal 事件

      进程接收到信号时就触发。信号列表详见标准的 POSIX 信号名,如 SIGINT、SIGUSR1 等。

    !!!详情不述,以后补充!!!

    util模块

    util 是一个Node.js 核心模块,提供常用函数的集合。

    util.inherits

    util.inherits(constructor, superConstructor)是一个实现对象间原型继承 的函数。

    constructor 仅仅继承了 superConstructor 在原型中定义的函数,而构造函数内部创造的属性和函数都没有被 constructor 继承

    util.inspect

    util.inspect(object,[showHidden],[depth],[colors]) 是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出。

    • showHidden 是一个可选参数,如果值为 true,将会输出更多隐藏信息。
    • depth 表示最大递归的层数,如果对象很复杂,你可以指定层数以控制输出信息的多 少。如果不指定depth,默认会递归2层,指定为 null 表示将不限递归层数完整遍历对象。
    • 如果color 值为 true,输出格式将会以ANSI 颜色编码,通常用于在终端显示更漂亮 的效果。

    util.isArray

    util.isArray(obj) 如果给定的参数是一个数组返回true,否则返回false。

    util.isRegExp

    util.isRegExp(obj) 如果给定的参数是一个正则表达式返回true,否则返回false。

    util.iaDate

    util.isDate(obj) 如果给定的参数是一个日期返回true,否则返回false。

    util.isError

    util.isError(obj) 如果给定的参数是一个错误对象返回true,否则返回false。

    文件系统

    require("fs")

    打开文件

    fs.open(path, flags[, mode], callback)

    • path 文件路径

    • flags 文件打开的行为

      r 读模式,文件不存在则抛出异常

      r+ 读写模式,文件不存在则抛出异常

      rs 同步读文件

      rs+ 同步读写文件

      w 写入文件,文件不存在则创建

      wx 写入文件,文件存在则抛出异常

      w+ 读写文件,文件不存在则创建

      wx+ 读写文件,文件存在则抛出异常

      a 追加文件,文件不存在则创建

      ax 追加文件,文件存在则抛出异常

      a+ 读取追加文件,文件不存在则创建

      ax+ 读写追加文件,文件存在则抛出异常

    • mode 设置文件权限,默认0666(可读可写)

    • callback 回调函数,带两个参数:callback(err,fd)

    获取文件信息

    fs.stat(path,callback)

    • path 文件路径

    • callback 回调函数,带两个参数:callback(err,stats),stats=fs.Stats

      stats.isFile() 是否是文件

      stats.isDirectory() 判断是否目录

      stats.isBlockDevice() 如果是块设备返回 true,否则返回 false

      stats.isCharacterDevice() 如果是字符设备返回 true,否则返回 false

      stats.isSymbolicLink() 如果是软链接返回 true,否则返回 false

      stats.isFIFO() 如果是FIFO,返回true,否则返回 false。FIFO是UNIX中的一种特殊类型的命令管道

      stats.isSocket() 如果是 Socket 返回 true,否则返回 false

    写入文件

    fs.writeFile(file, data[, options], callback)

    默认 w 模式

    • file - 文件名或文件描述符。
    • data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(缓冲) 对象。
    • options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 'w'
    • callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。

    读取文件

    fs.read(fd, buffer, offset, length, position, callback)

    • fd - 通过 fs.open() 方法返回的文件描述符。
    • buffer - 数据写入的缓冲区。
    • offset - 缓冲区写入的写入偏移量。
    • length - 要从文件中读取的字节数。
    • position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
    • callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。

    关闭文件

    fs.close(fd, callback)

    • fd - 通过 fs.open() 方法返回的文件描述符。
    • callback - 回调函数,没有参数。

    截取文件

    fs.ftruncate(fd, len, callback)

    • fd - 通过 fs.open() 方法返回的文件描述符。
    • len - 文件内容截取的长度。
    • callback - 回调函数,没有参数。

    删除文件

    fs.unlink(path, callback)

    • path - 文件路径。
    • callback - 回调函数,没有参数。

    创建目录

    fs.mkdir(path[, options], callback)

    • path - 文件路径。
    • options 参数可以是:
      • recursive - 是否以递归的方式创建目录,默认为 false。
      • mode - 设置目录权限,默认为 0777。
    • callback - 回调函数,没有参数。

    读取目录

    fs.readdir(path, callback)

    • path - 文件路径。
    • callback - 回调函数,回调函数带有两个参数err, files,err 为错误信息,files 为 目录下的文件数组列表。

    删除目录

    fs.rmdir(path, callback)

    • path - 文件路径。
    • callback - 回调函数,没有参数。

    WEB GET/POST

    response

    response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:

    1. res.app:同req.app一样
    2. res.append():追加指定HTTP头
    3. res.set()在res.append()后将重置之前设置的头
    4. res.cookie(name,value [,option]):设置Cookie
    5. opition: domain / expires / httpOnly / maxAge / path / secure / signed
    6. res.clearCookie():清除Cookie
    7. res.download():传送指定路径的文件
    8. res.get():返回指定的HTTP头
    9. res.json():传送JSON响应
    10. res.jsonp():传送JSONP响应
    11. res.location():只设置响应的Location HTTP头,不设置状态码或者close response
    12. res.redirect():设置响应的Location HTTP头,并且设置状态码302
    13. res.render(view,[locals],callback):渲染一个view,同时向callback传递渲染后的字符串,如果在渲染过程中有错误发生next(err)将会被自动调用。callback将会被传入一个可能发生的错误以及渲染后的页面,这样就不会自动输出了。
    14. res.send():传送HTTP响应
    15. res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
    16. res.set():设置HTTP头,传入object可以一次设置多个头
    17. res.status():设置HTTP状态码
    18. res.type():设置Content-Type的MIME类型

    request

    request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:

    1. req.app:当callback为外部文件时,用req.app访问express的实例
    2. req.baseUrl:获取路由当前安装的URL路径
    3. req.body / req.cookies:获得「请求主体」/ Cookies
    4. req.fresh / req.stale:判断请求是否还「新鲜」
    5. req.hostname / req.ip:获取主机名和IP地址
    6. req.originalUrl:获取原始请求URL
    7. req.params:获取路由的parameters
    8. req.path:获取请求路径
    9. req.protocol:获取协议类型
    10. req.query:获取URL的查询参数串
    11. req.route:获取当前匹配的路由
    12. req.subdomains:获取子域名
    13. req.accepts():检查可接受的请求的文档类型
    14. req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages:返回指定字符集的第一个可接受字符编码
    15. req.get():获取指定的HTTP请求头
    16. req.is():判断请求头Content-Type的MIME类型

    ERROR & SOLUTION

    安装express模块

    ERROR:在执行npm install express命令时出现了以下错误:no such file or directory, open 'W:xxxxxxpackage.json'

    SOLUTION:使用npm install express -g命令来安装

    ERROR:在 js 文件中导入 express 时出现Error: Cannot find module 'express'错误

    SOLUTION:1. 直接在项目目录下执行安装命令;2. js 文件中导入 express 模块时使用绝对路径,比如var express = require('C:/Users/user/AppData/Roaming/npm/node_modules/express');

  • 相关阅读:
    FreeBSD使用多线程下载工具axel
    类UNIX系统基础:文件安全与权限
    基于pf防火墙控制IP连接数
    在FreeBSD下搭建高性能企业级网关与代理服务器
    搭建自己的CVSup服务器
    转:Spring技术内幕——深入解析Spring架构与设计原理(三)IOC实现原理
    Spring Web MVC的实现(二)
    java中HashSet详解
    转:Spring技术内幕——深入解析Spring架构与设计原理(二)IOC实现原理
    DIV垂直水平都居中
  • 原文地址:https://www.cnblogs.com/fengzzi/p/10399519.html
Copyright © 2020-2023  润新知