node.js---基础学习

摘要:
事件节点J基本上使用设计模式中的观察者模式来实现所有事件机制。对于每个事件,EventEmitter都支持几个事件监听器。RemoveListenerevent-字符串,事件名称;监听器-事件处理函数从指定的监听器数组中删除监听器。事件.发射器。ListenerCountaddListener将侦听器添加到指定事件的侦听器数组的尾部。在节点中缓冲。js,定义了B

安装配置

下载地址

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');

免责声明:文章转载自《node.js---基础学习》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iframe 高度自适应/以及在ie8中空白问题简便的将DataSet导入到数据库中下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Mock 基本使用

特殊的格式,例如IP,随机数,图片,地址,需要去收集二、mock优点1、前后端分离让前端工程师独立于后端进行开发。表示需要拦截的Ajax请求类型。表示数据模板,可以是对象或字符串。表示用于生成响应数据的函数。...

Ubuntu下安装Latex [转]

Ubuntu下LaTex中文环境配置LaTeX是一个强大的排版软件,但是其最初只是为英文排版而设计的。第一步,安装基本的LaTeX环境:sudoapt-getinstalltexlive第二步,安装中文字体包。sudoapt-getinstalllatex-cjk-all至此,基本的配置就完成了。正常情况下,编译这个tex文件就能在文档中显示中文了。\doc...

ftp命令

ftp命令是标准文件传输协议的用户界面。Ftp是在TCP/IP网络上的计算机之间传输文件的一种简单有效的方法。它允许用户传输ASCII文件和二进制文件。用户可以在目录中上下移动,列出目录内容,将文件从远程计算机复制到本地计算机,并将文件从本地计算机传输到远程系统。它用于确定用户可以对要传输的文件进行何种访问。用户显然需要知道进行ftp会话的计算机的名称或IP...

Fiddler断点应用

对于不需要修改的报文,我们可以手动完成发送,fiddler会把拦截的网页发送到服务器或者客户端,需要修改的报文,可以在Fiddler修改完成后,再选择转发。另外,我们也可以使用Fiddler的断点功能模拟网络中断场景,验证服务器超时,客户端的处理情况。Afterresponses:服务器响应之后,在fiddler将响应传回给客户端之前。...

Ubuntu 下查看CPU 信息命令

看看带有“处理器”一词的行数,即逻辑CPU的数量。因此,您可以在cmd下输入以下命令:cat/proc/cpuinfo|greproprocessor|wc-l因此,C++程序自然会想到使用strstr函数来查找processor关键字的出现次数。...

MeteoInfo-Java解析与绘图教程(一)

MeteoInfo-Java解析与绘图教程(一)已经进入开发行业很多年了,这两年一直从事气象开发行业,为此对气象绘图有了新的见解像色斑图与卫星图一直都有python去绘制,在偶然的情况下,我接触到了meteoInfo,在对其使用过程中,也可以做到用java绘制格点散点图,色斑图,等值图,卫星图,风场图所以趁这个机会我开始记录自己的探索过程,方便你我他对于绘图...