大佬教程收集整理的这篇文章主要介绍了Node.js从入门到实战(二)Node.js基本用法,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
参考:
一、Node.js中的模块
Node.js使用require引入依赖的模块,因此模块是Node.js中的重要组成部分,这篇博客主要罗列一下常用的Node.js模块,并且在后期会添加在工作中用到的模块参考备用。
二、Node.js EventEmitter
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。Node.js里面的许多对象都会分发事件,所有这些产生事件的对象都是 events.EventEmitter 的实例。
events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。你可以通过require("events");来访问该模块。
// 引入 events 模块 var events = require('events'); // 创建 eventEmitter 对象 var eventEmitter = new events.EventEmitter();EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个事件监听器。当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。
//event.js @L_874_12@ var events = require('events'); var emitter = new events.EventEmitter(); emitter.on('someEvent',function(arg1,arg2) { console.log('listener1',arg1,arg2); }); emitter.on('someEvent',arg2) { console.log('listener2',arg2); }); emitter.emit('someEvent','arg1 参数','arg2 参数');emitter 为事件 someEvent 注册了两个事件监听器,然后触发了 someEvent 事件。运行结果中可以看到两个事件监听器回调函数被先后调用。 这就是EventEmitter最简单的用法。EventEmitter 提供了多个属性,如 on 和 emit。 on 函数用于绑定事件函数,emit 属性用于触发一个事件。接下来我们来具体看下 EventEmitter 的 属性介绍。
序号 | 方法 & 描述 |
---|---|
1 | addListener(event,listener) 为指定事件添加一个监听器到监听器数组的尾部。 |
2 | on(event,listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。 server.on('connection', function (stream){ consolelog'someone connected!'); }); |
3 | once(event,listener) 为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。 once'Ah,we have our first user!'}); |
removeListener(event,listener) 移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。 var callBACk =function}; server callBACk // ...removeListener); |
|
5 | removeAllListeners([event]) 移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。 |
setMaxListeners(n) 默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。 |
|
7 | listeners(event) 返回指定事件的监听器数组。 |
emit(event,[arg1],[arg2],[...]) 按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false。 |
newListener 该事件在添加新监听器时被触发。 |
var events = require('events'); var emitter = new events.EventEmitter(); emitter.emit('error');
node.js:201 throw e; // process.nextTick error,or 'error' event on first tick ^ Error: Uncaught,unspecified 'error' event. at EventEmitter.emit (events.js:50:15) at Object.<anonymous> (/home/byvoid/error.js:5:9) at Module._compile (module.js:441:26) at Object..js (module.js:459:10) at Module.load (module.js:348:31) at Function._load (module.js:308:12) at Array.0 (module.js:479:10) at EventEmitter._tickCallBACk (node.js:192:40)
三、Node.js Buffer
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或@L_874_12@流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。
Buffer 实例一般用于表示编码字符的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六进制编码的数据。 通过使用显式的字符编码,就可以在 Buffer 实例与普通的 JavaScript 字符串之间进行相互转换。Node.js 目前支持的字符编码包括:
Buffer类中的方法如下:
new Buffer(str[,encoding]) 分配一个新的 buffer ,其中包含着传入的 str 字符串。 encoding 编码方式默认为 'utf8'。 废弃的: 使用 Buffer.from(String[,encoding]) 代替。 |
|
buf.write(String[,offset[,length]][,encoding]) 根据参数 offset 偏移量和指定的 encoding 编码方式,将参数 String 数据写入buffer。 offset 偏移量默认值是 0,encoding 编码方式默认是 utf8。 length 长度是将要写入的字符串的 bytes 大小。 返回 number 类型,表示写入了多少 8 位字节流。如果 buffer 没有足够的空间来放整个 String,它将只会只写入部分字符串。 length 默认是 buffer.length - offset。 这个方法不会出现写入部分字符。 |
|
buf.writeUIntBE(value,noAssert]) 将 value 写入到 buffer 里, 它由 offset 和 byteLength 决定,最高支持 48 位无符号整数,大端对齐。noAssert 值为 true 时,不再验证 value 和 offset 的有效性。 默认是 false。 writeUIntBE// 输出: <Buffer 12 34 56 78 90 ab>); |
|
9 | buf.writeIntBE(value,noAssert]) 将value 写入到 buffer 里, 它由offset 和 byteLength 决定,最高支持48位有符号整数,大端对齐。noAssert 值为 true 时,不再验证 value 和 offset 的有效性。 默认是 false。 |
buf.readUIntLE(offset,noAssert]) 支持读取 48 位以下的无符号数字,小端对齐。noAssert 值为 true 时, offset 不再验证是否超过 buffer 的长度,默认为 false。 |
|
11 | buf.readUIntBE(offset,noAssert]) 支持读取 48 位以下的无符号数字,大端对齐。noAssert 值为 true 时, offset 不再验证是否超过 buffer 的长度,默认为 false。 |
buf.readIntLE(offset,noAssert]) 支持读取 48 位以下的有符号数字,小端对齐。noAssert 值为 true 时, offset 不再验证是否超过 buffer 的长度,默认为 false。 |
|
13 | buf.readIntBE(offset,noAssert]) 支持读取 48 位以下的有符号数字,大端对齐。noAssert 值为 true 时, offset 不再验证是否超过 buffer 的长度,默认为 false。 |
buf.toString([encoding[,start[,end]]]) 根据 encoding 参数(默认是 'utf8')返回一个解码过的 String 类型。还会根据传入的参数 start (默认是 0) 和 end (默认是 buffer.length)作为取值范围。 |
|
15 | buf.toJSON() 将 Buffer 实例转换为 JSON 对象。 |
buf[index] 获取或设置指定的字节。返回值代表一个字节,所以返回值的合法范围是十六进制0x00到0xFF 或者十进制0至 255。 |
|
17 | buf.equals(otherBuffer) 比较两个缓冲区是否相等,如果是返回 true,否则返回 false。 |
buf.compare(otherBuffer) 比较两个 Buffer 对象,返回一个数字,表示 buf 在 otherBuffer 之前,之后或相同。 |
|
19 | buf.copy(targetBuffer[,targetStart[,sourceStart[,sourceEnd]]]) buffer 拷贝,源和目标可以相同。 targetStart 目标开始偏移和 sourceStart 源开始偏移默认都是 0。 sourceEnd 源结束位置偏移默认是源的长度 buffer.length 。 |
buf.slice([start[,end]]) 剪切 Buffer 对象,根据 start(默认是 0 ) 和 end (默认是 buffer.length ) 偏移和裁剪了索引。 负的索引是从 buffer 尾部开始计算的。 |
|
21 | buf.readUInt8(offset[,noAssert]) 根据指定的偏移量,读取一个无符号 8 位整数。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 如果这样 offset 可能会超出buffer 的末尾。默认是 false。 |
buf.readUInt16LE(offset[,noAssert]) 根据指定的偏移量,使用特殊的 endian 字节序格式读取一个无符号 16 位整数。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。 |
|
23 | buf.readUInt16BE(offset[,noAssert]) 根据指定的偏移量,使用特殊的 endian 字节序格式读取一个无符号 16 位整数,大端对齐。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。 |
buf.readUInt32LE(offset[,noAssert]) 根据指定的偏移量,使用指定的 endian 字节序格式读取一个无符号 32 位整数,小端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。 |
|
25 | buf.readUInt32BE(offset[,noAssert]) 根据指定的偏移量,使用指定的 endian 字节序格式读取一个无符号 32 位整数,大端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。 |
buf.readInt8(offset[,noAssert]) 根据指定的偏移量,读取一个有符号 8 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。 |
|
27 | buf.readInt16LE(offset[,noAssert]) 根据指定的偏移量,使用特殊的 endian 格式读取一个 有符号 16 位整数,小端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。 |
buf.readInt16BE(offset[,noAssert]) 根据指定的偏移量,使用特殊的 endian 格式读取一个 有符号 16 位整数,大端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。 |
|
29 | buf.readInt32LE(offset[,noAssert]) 根据指定的偏移量,使用指定的 endian 字节序格式读取一个有符号 32 位整数,小端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。 |
buf.readInt32BE(offset[,noAssert]) 根据指定的偏移量,使用指定的 endian 字节序格式读取一个有符号 32 位整数,大端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。 |
|
31 | buf.readFloatLE(offset[,noAssert]) 根据指定的偏移量,使用指定的 endian 字节序格式读取一个 32 位双浮点数,小端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer的末尾。默认是 false。 |
buf.readFloatBE(offset[,noAssert]) 根据指定的偏移量,使用指定的 endian 字节序格式读取一个 32 位双浮点数,大端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer的末尾。默认是 false。 |
|
33 | buf.readDoubleLE(offset[,noAssert]) 根据指定的偏移量,使用指定的 endian字节序格式读取一个 64 位双精度数,小端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。 |
buf.readDoubleBE(offset[,noAssert]) 根据指定的偏移量,使用指定的 endian字节序格式读取一个 64 位双精度数,大端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。 |
|
35 | buf.writeUInt8(value,noAssert]) 根据传入的 offset 偏移量将 value 写入 buffer。注意:value 必须是一个合法的无符号 8 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则不要使用。默认是 false。 |
buf.writeUInt16LE(value,noAssert]) 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的无符号 16 位整数,小端对齐。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。 |
|
37 | buf.writeUInt16BE(value,noAssert]) 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的无符号 16 位整数,大端对齐。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。 |
buf.writeUInt32LE(value,noAssert]) 根据传入的 offset 偏移量和指定的 endian 格式(LITTLE-ENDIAN:小字节序)将 value 写入buffer。注意:value 必须是一个合法的无符号 32 位整数,小端对齐。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着value 可能过大,或者offset可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。 |
|
39 | buf.writeUInt32BE(value,noAssert]) 根据传入的 offset 偏移量和指定的 endian 格式(Big-Endian:大字节序)将 value 写入buffer。注意:value 必须是一个合法的有符号 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者offset可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。 |
buf.writeInt8(value,noAssert])<br根据传入的 offset="" 偏移量将="" value="" 写入="" buffer="" 。注意:value="" 必须是一个合法的="" signed="" 8="" 位整数。="" 若参数="" noassert="" 为="" true="" 将不会验证="" 和="" 偏移量参数。="" 这意味着="" 可能过大,或者="" 可能会超出="" 的末尾从而造成="" 被丢弃。="" 除非你对这个参数非常有把握,否则尽量不要使用。默认是="" false。<="" td=""> | |
41 | buf.writeInt16LE(value,noAssert]) 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 16 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false 。 |
buf.writeInt16BE(value,noAssert]) 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 16 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false 。 |
|
43 | buf.writeInt32LE(value,noAssert]) 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。 |
buf.writeInt32BE(value,noAssert]) 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。 |
|
45 | buf.writeFloatLE(value,noAssert]) 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer 。注意:当 value 不是一个 32 位浮点数类型的值时,结果将是不确定的。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。 |
buf.writeFloatBE(value,noAssert]) 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer 。注意:当 value 不是一个 32 位浮点数类型的值时,结果将是不确定的。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。 |
|
47 | buf.writeDoubleLE(value,noAssert]) 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个有效的 64 位double 类型的值。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成value被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。 |
buf.writeDoubleBE(value,noAssert]) 根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个有效的 64 位double 类型的值。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成value被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。 |
|
49 | buf.fill(value[,offset][,end]) 使用指定的 value 来填充这个 buffer。如果没有指定 offset (默认是 0) 并且 end (默认是 buffer.length) ,将会填充整个buffer。 |
Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。Node.js,Stream 有四种流类型:
var fs = require("fs"); var data = ''; // 创建可读流 var readerStream = fs.createReadStream('input.txt'); // 设置编码为 utf8。 readerStream.setEncoding('UTF8'); // 处理流事件 --> data,end,and error readerStream.on('data',function(chunk) { data += chunk; }); readerStream.on('end',function(){ console.log(data); }); readerStream.on('error',function(err){ console.log(err.stack); }); console.log("程序执行完毕");如下代码显示了Stream WriteStream的用法:
var fs = require("fs"); var data = '菜鸟教程官网地址:www.runoob.com'; // 创建一个可以写入的流,写入到@L_874_12@ output.txt 中 var writerStream = fs.createWriteStream('output.txt'); // 使用 utf8 编码写入数据 writerStream.write(data,'UTF8'); // 标记@L_874_12@末尾 writerStream.end(); // 处理流事件 --> data,and error writerStream.on('finish',function() { console.log("写入完成。"); }); writerStream.on('error',function(err){ console.log(err.stack); }); console.log("程序执行完毕");Stream具备管道流和链式流两种用法:
@H_450_804@管道流:
var fs = require("fs"); // 创建一个可读流 var readerStream = fs.createReadStream('input.txt'); // 创建一个可写流 var writerStream = fs.createWriteStream('output.txt'); // 管道读写操作 // 读取 input.txt @L_874_12@内容,并将内容写入到 output.txt @L_874_12@中 readerStream.pipe(writerStream); console.log("程序执行完毕");管道流可以处理读写操作。
链式流:
链式是通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作。
接下来我们就是用管道和链式来压缩和解压@L_874_12@。创建 compress.js @L_874_12@,代码如下:
var fs = require("fs"); var zlib = require('zlib'); // 压缩 input.txt @L_874_12@为 input.txt.gz fs.createReadStream('input.txt') .pipe(zlib.createGzip()) .pipe(fs.createWriteStream('input.txt.gz')); console.log("@L_874_12@压缩完成。");
Node.js路由中对http请求的URL的解析需要依赖以下url 和queryString 模块:
url.parse(String).query | url.parse(String).pathname | | | | | ------ ------------------- http://localhost:8888/start?foo=bar&Hello=world --- ----- | | | | queryString.parse(queryString)["foo"] | | queryString.parse(queryString)["Hello"]现在我们来给 onrequest() 函数加上一些逻辑,用来找出浏览器请求的 URL 路径,server.js@L_874_12@的内容如下:
var http = require("http"); var url = require("url"); function start() { function onrequest(request,responsE) { var pathname = url.parse(request.url).pathname; console.log("request for " + pathname + " received."); response.writeHead(200,{"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); } http.createServer(onrequest).listen(8888); console.log("Server has started."); } exports.start = start;此时的server并无区分pathname映射的能力,如下添加router.js用于处理来自不同路径的请求:
function route(pathName) { console.log("About to route a request for " + pathName); } exports.route = route;首先,我们来扩展一下服务器的 start() 函数,以便将路由函数作为参数传递过去:
var http = require("http"); var url = require("url"); function start(routE) { function onrequest(request,responsE) { var pathname = url.parse(request.url).pathname; console.log("request for " + pathname + " received."); route(pathName); response.writeHead(200,{"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); } http.createServer(onrequest).listen(8888); console.log("Server has started."); } exports.start = start;同时,我们会相应扩展 index.js,使得路由函数可以被注入到服务器中:
var server = require("./server"); var router = require("./router"); server.start(router.routE);此时请求localhost:8888时即经过了router的处理。
JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。
在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性。在 Node.js 我们可以直接访问到 global 的属性,而不需要在应用中包含它。
global 最根本的作用是作为全局变量的宿主。按照 ECMAScript 的定义,满足以下条 件的变量是全局变量:
console.error([data][,...]) 输出错误消息的。控制台在出现错误时会显示是红色的叉子。 |
console.dir(obj[,options]) 用来对一个对象进行检查(inspect),并以易于阅读和打印的格式显示。 |
console.timeEnd(label) 结束时间,表示计时结束。 |
console.assert(value[,message][,...]) 用于判断某个表达式或变量是否为真,接收两个参数,第一个参数是表达式,第二个参数是字符串。只有当第一个参数为false,才会输出第二个参数,否则不会有任何结果。 |
uncaughtException 当一个异常冒泡回到事件循环,触发这个事件。如果给异常添加了监视器,默认的操作(打印堆栈跟踪信息并退出)就不会发生。 |
util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足。
var util = require('util'); function Base() { this.name = 'base'; this.base = 1991; this.sayHello = function() { console.log('Hello ' + this.Name); }; } Base.prototype.showName = function() { console.log(this.Name); }; function Sub() { this.name = 'sub'; } util.inherits(Sub,BasE); var objBase = new Base(); objBase.showName(); objBase.sayHello(); console.log(objBasE); var objSub = new Sub(); objSub.showName(); //objSub.sayHello(); console.log(objSub);运行结果如下:
base Hello base { name: 'base',base: 1991,sayHello: [Function] } sub { name: 'sub' }
var fs = require("fs")
flags 参数可以是以下值:
描述 | |
---|---|
r | 以读取模式打开@L_874_12@。如果@L_874_12@不存在抛出异常。 |
以读写模式打开@L_874_12@。如果@L_874_12@不存在抛出异常。 | |
rs | 以同步的方式读取@L_874_12@。 |
以同步的方式读取和写入@L_874_12@。 | |
w | 以写入模式打开@L_874_12@,如果@L_874_12@不存在则创建。 |
类似 'w',但是如果@L_874_12@路径存在,则@L_874_12@写入失败。 | |
w+ | 以读写模式打开@L_874_12@,如果@L_874_12@不存在则创建。 |
类似 'w+', 但是如果@L_874_12@路径存在,则@L_874_12@读写失败。 | |
a | 以追加模式打开@L_874_12@,如果@L_874_12@不存在则创建。 |
类似 'a', 但是如果@L_874_12@路径存在,则@L_874_12@追加失败。 | |
a+ | 以读取追加模式打开@L_874_12@,如果@L_874_12@不存在则创建。 |
类似 'a+', 但是如果@L_874_12@路径存在,则@L_874_12@读取追加失败。 |
var fs = require("fs"); // 异步打开@L_874_12@ console.log("准备打开@L_874_12@!"); fs.open('input.txt','r+',function(err,fd) { if (err) { return console.error(err); } console.log("@L_874_12@打开成功!"); });
var fs = require("fs"); // 异步读取 fs.readFile('input.txt',function (err,data) { if (err) { return console.error(err); } console.log("异步读取: " + data.toString()); }); // 同步读取 var data = fs.readFileSync('input.txt'); console.log("同步读取: " + data.toString()); console.log("程序执行完毕。");
由于GET请求直接被嵌入在路径中,URL是完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET请求的参数。node.js 中 url 模块中的 parse 函数提供了这个功能。
var http = require('http'); var url = require('url'); var util = require('util'); http.createServer(function(req,res){ res.writeHead(200,{'Content-Type': 'text/plain'}); // 解析 url 参数 var params = url.parse(req.url,truE).query; res.write("网站名:" + params.Name); res.write("\n"); res.write("网站 URL:" + paramS.Url); res.end(); }).listen(3000);@H_450_804@获取 POST 请求内容:
var http = require('http'); var queryString = require('queryString'); http.createServer(function(req,res){ // 定义了一个post变量,用于暂存请求体的信息 var post = ''; // 通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中 req.on('data',function(chunk){ post += chunk; }); // 在end事件触发后,通过queryString.parse将post解析为真正的POST请求格式,然后向客户端返回。 req.on('end',function(){ post = queryString.parse(post); res.end(util.inspect(post)); }); }).listen(3000);以下实例表单通过 POST 提交并输出数据:
var http = require('http'); var queryString = require('queryString'); var postHTML = '<html><head><Meta charset="utf-8"><title>Node.js 实例</title></head>' + '<body>' + '<form method="post">' + '网站名: <input name="name"><br>' + '网站 URL: <input name="url"><br>' + '<input type="submit">' + '</form>' + '</body></html>'; http.createServer(function (req,res) { var body = ""; req.on('data',function (chunk) { body += chunk; }); req.on('end',function () { // 解析参数 body = queryString.parse(body); // 设置响应头部信息及编码 res.writeHead(200,{'Content-Type': 'text/html; charset=utf8'}); if(body.name && body.url) { // 输出提交的数据 res.write("网站名:" + body.Name); res.write("<br>"); res.write("网站 URL:" + body.url); } else { // 输出表单 res.write(postHTML); } res.end(); }); }).listen(3000);
Node.js 提供了 http 模块,http 模块主要用于搭建 http 服务端和客户端,使用 http 服务器或客户端功能必须调用 http 模块,代码如下:
var http = require('http');Node.js创建的服务器端使用Node.js@L_874_12@作为服务器,使用Html+CSS作为前台界面,如下是一个基本Web服务器的后台代码:
var http = require('http'); var fs = require('fs'); var url = require('url'); // 创建服务器 http.createServer( function (request,responsE) { // 解析请求,包括@L_874_12@名 var pathname = url.parse(request.url).pathname; // 输出请求的@L_874_12@名 console.log("request for " + pathname + " received."); // 从@L_874_12@系统中读取请求的@L_874_12@内容 fs.readFile(pathname.substr(1),data) { if (err) { console.log(err); // http 状态码: 404 : NOT FOUND // Content Type: text/plain response.writeHead(404,{'Content-Type': 'text/html'}); }else{ // http 状态码: 200 : OK // Content Type: text/plain response.writeHead(200,{'Content-Type': 'text/html'}); // 响应@L_874_12@内容 response.write(data.toString()); } // 发送响应数据 response.end(); }); }).listen(8080); // 控制台会输出以下信息 console.log('Server running at http://127.0.0.1:8080/');接下来我们在该目录下创建一个 index.html @L_874_12@,代码如下:
<!DOCTYPE html> <html> <head> <Meta charset="utf-8"> <title>My First Page</title> </head> <body> <h1>我的第一个标题</h1> <p>我的第一个段落。</p> </body> </html>
Express 是一个简洁而灵活的 node.js Web应用框架,提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 http 工具。
使用 Express 可以快速地搭建一个完整功能的网站。Express 框架核心特性:
$ npm install express --save以上命令会将 Express 框架安装在当前目录的node_modules 目录中, node_modules 目录下会自动创建express 目录。以下几个重要的模块是需要与 express 框架一起安装的:
request 对象 - request 对象表示 http 请求,包含了请求查询字符串,参数,内容,http 头部等属性。常见属性有:
路由
在http请求中,我们可以通过路由提取出请求的URL以及GET/POST参数。接下来我们扩展 Hello World,添加一些功能来处理更多类型的 http 请求。创建 express_demo2.js @L_874_12@,代码如下所示:
var express = require('express'); var app = express(); // 主页输出 "Hello World" app.get('/',function (req,res) { console.log("主页 GET 请求"); res.send('Hello GET'); }) // POST 请求 app.post('/',res) { console.log("主页 POST 请求"); res.send('Hello POST'); }) // /del_user 页面响应 app.get('/del_user',res) { console.log("/del_user 响应 deletE 请求"); res.send('删除页面'); }) // /list_user 页面 GET 请求 app.get('/list_user',res) { console.log("/list_user GET 请求"); res.send('@L_607_219@列表页面'); }) // 对页面 abcd,abxcd,ab123cd,等响应 GET 请求 app.get('/ab*cd',function(req,res) { console.log("/ab*cd GET 请求"); res.send('正则匹配'); }) var server = app.listen(8081,function () { var host = server.address().address var port = server.address().port console.log("应用实例,访问地址为 http://%s:%s",host,port) })执行以上代码后,接下来你可以尝试访问 http://127.0.0.1:8081 不同的地址,查看效果。
@H_963_1489@
Express 提供了内置的中间件 express.static 来设置静态文件如:图片, CSS,JavaScript 等。你可以使用 express.static 中间件来设置静态文件路径。例如,如果你将图片, CSS,JavaScript @L_874_12@放在 public 目录下,你可以这么写:
app.use(express.static('public'));我们可以到 public/images 目录下放些图片,如下所示:
node_modules server.js public/ public/images public/images/logo.png未完待续
以上是大佬教程为你收集整理的Node.js从入门到实战(二)Node.js基本用法全部内容,希望文章能够帮你解决Node.js从入门到实战(二)Node.js基本用法所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。