安装配置
x64 windows
window 64位 msi 文件,安装过程中可以调整安装位置,安装完成以后会在系统的 Path 配置里添加 node 的安装路径。
验证方法一:安装完成以后,可以通过在命令行中执行path
命令,即可查看系统的path值,其中如果有包含node.js的安装路径,安装成功。
验证方法二:通过在命令行中执行node -v
命令即可查看安装好的 Node.js 的版本;也可以通过npm -v
来查看npm版本。
基础了解
Node.js 应用是由以下部分组成的:
- 引入 required 模块:使用 require 指令来载入 Node.js 模块。
- 创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。
- 接收请求与响应请求 服务器很容易创建,客户端可以使用浏览器或终端发送 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 响应数据。常见属性有:
- res.app:同req.app一样
- res.append():追加指定HTTP头
- res.set()在res.append()后将重置之前设置的头
- res.cookie(name,value [,option]):设置Cookie
- opition: domain / expires / httpOnly / maxAge / path / secure / signed
- res.clearCookie():清除Cookie
- res.download():传送指定路径的文件
- res.get():返回指定的HTTP头
- res.json():传送JSON响应
- res.jsonp():传送JSONP响应
- res.location():只设置响应的Location HTTP头,不设置状态码或者close response
- res.redirect():设置响应的Location HTTP头,并且设置状态码302
- res.render(view,[locals],callback):渲染一个view,同时向callback传递渲染后的字符串,如果在渲染过程中有错误发生next(err)将会被自动调用。callback将会被传入一个可能发生的错误以及渲染后的页面,这样就不会自动输出了。
- res.send():传送HTTP响应
- res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
- res.set():设置HTTP头,传入object可以一次设置多个头
- res.status():设置HTTP状态码
- res.type():设置Content-Type的MIME类型
request
request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:
- req.app:当callback为外部文件时,用req.app访问express的实例
- req.baseUrl:获取路由当前安装的URL路径
- req.body / req.cookies:获得「请求主体」/ Cookies
- req.fresh / req.stale:判断请求是否还「新鲜」
- req.hostname / req.ip:获取主机名和IP地址
- req.originalUrl:获取原始请求URL
- req.params:获取路由的parameters
- req.path:获取请求路径
- req.protocol:获取协议类型
- req.query:获取URL的查询参数串
- req.route:获取当前匹配的路由
- req.subdomains:获取子域名
- req.accepts():检查可接受的请求的文档类型
- req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages:返回指定字符集的第一个可接受字符编码
- req.get():获取指定的HTTP请求头
- 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');
;