NodeJs入門基本教程


module和exports

 1 /*
 2 * module和exports
 3 *
 4 * 在一個模塊中通過val定義的變量,其作用域范圍是當前模塊,外部不能夠直接的訪問
 5 * 如果我們想一個模塊能夠訪問另外一個模塊中定義的變量,有如下方式:
 6 */
 7 
 8 
 9 /*
10 * 1.把變量作為global對象的一個屬性,但是這樣的做法不推薦
11 */
12 global.a = 100;
13 console.log(global.a);
14 
15 /*
16 * 2.使用模塊對象 module
17 *
18 * module: 保存提供和當前模塊有關的一些信息
19 *
20 * 在這個module對象,有一個子對象:exports對象
21 * 我們可以通過這個對象把一個模塊中的局部變量對象進行提供訪問
22 */
23 
24 console.log(module);
25 // Module {
26 //   id: '.',
27 //   exports: {},
28 //   parent: null,
29 //   filename: 'G:\\js-study\\第11節\\module\\01.js',
30 //   loaded: false,
31 //   children: [],
32 //   paths: ['G:\\js-study\\第11節\\module\\node_modules',
33 //           'G:\\js-study\\第11節\\node_modules',
34 //           'G:\\js-study\\node_modules',
35 //           'G:\\node_modules' ]
36 // }
37 
38 
39 // 1.js定義如下
40 var a = 100;
41 module.exports.a = a;
42 
43 // 2.js接收1.js
44 var m5 = require('./1') // 這個方法的返回值,其實就是被加載模塊中的module.exports
45 console.log(m5) // { a: 100}
46 
47 /*
48 * 在模塊作用域中:還有一個內置的模塊對象: exports
49 * 它其實就是module.exports對象。
50 */
51 
52 console.log(exports === module.exports); // true
53 
54 // 注意:使用exports或者module.exports時不要直接改變對象指向,
55 // 一旦改變對象指向exports和module.exports就不會相等。

 Global全局變量之process對象

 1 /*
 2 * __filename: 返回當前模塊文件解析后的絕對路徑,該屬性其實並非全局的,而是模塊作用域下的。
 3 * __dirname: 返回當前模塊文件所在目錄解析后的絕對路徑,該屬性也不是全局的,而是模塊作用域下的。
 4 *
 5 */
 6 
 7 
 8 /*
 9 * process對象:它是一個全局對象,可以在任何地方都能訪問到它,
10 * 通過這個對象提供的屬性和方法,使我們可以對當前運行的程序的
11 * 進程進行訪問和控制
12 */
13 
14 // 1.process.argv: 一個包含命令行參數的數組,第一個元素是'node',
15 // 第二個元素是.js文件的名稱。接下來的元素依次是命令行傳入的參數
16 
17 // 在2.js中遍歷process.argv
18 process.argv.forEach(function (val, index,  array) {
19   console.log(index + ': ' + val)
20 })
21 
22 // 執行 node 02.js one two three 命令,
23 // 打印:
24 // 0: node
25 // 1: ......../2.js
26 // 2: one
27 // 3: two
28 // 4: four
29 
30 // 2.process.execPath: 返回啟動Node.js進程的可執行文件的絕對路徑名
31 console.log(process.execPath); // C:\Program Files\nodejs\node.exe
32 
33 // 3.process.env: 返回用戶環境信息
34 console.log(process.env);
35 
36 // 4.process.pid: 返回進程的pid(可到任務管理器中查看)
37 console.log(process.pid); // 4452
38 
39 // 5.process.title: 當前進程的顯示名稱
40 console.log(process.title); // D:\WebStorm 2018.2.1\bin\runnerw.exe
41 
42 // 6.process.arch: 返回當前CPU處理器架構arm/ia32/x64
43 console.log(process.arch); // x64

process對象:stdin, stdout標准輸入輸出流(IO)

 1 /*
 2 * process對象:stdin, stdout標准輸入輸出流(IO)
 3 * stdin和stdout提供了操作輸入數據和輸出數據的方法,
 4 * 我們通常稱為IO操作
 5 *
 6 * stdin: 標准輸入流
 7 * stdout: 標准輸出流
 8 */
 9 
10 // 默認情況下,輸入流是關閉的,要監聽處理輸入流數據,首先要開啟輸入流
11 process.stdin.resume();
12 
13 // 用於監聽用戶的輸入數據
14 process.stdin.on('data', function (chunk) {
15   process.stdout.write(chunk)
16   console.log('用戶輸入了:' + chunk)
17   process.exit()
18 })
19 
20 /*
21 * 輸入a, b 輸出 a + b 的值
22 * */
23 var a,
24   b;
25 
26 process.stdin.resume();
27 process.stdout.write('請輸入a的值:');
28 process.stdin.on('data', function (chunk) {
29   if (!a) {
30     a = Number(chunk);
31     process.stdout.write('請輸入b的值:');
32   } else {
33     b = Number(chunk);
34     process.stdout.write('a + b = ' + (a + b));
35     process.exit();
36   }
37 });

Global全局變量:Buffer類

一個用於更好的操作二進制數據的類,我們在操作文件或者網絡數據的時候
其實就是操作的二進制數據流,node為我們提供了一個更加方便的去操作這
種數據流的類Buffer,它是一個全局的類

console.log(global.Buffer === Buffer); // true

1.實例化Buffer類

1. new Buffer(size); size [Number] 創建一個Buffer對象,並為這個對象分配一個大小
最新版本已經變成Buffer.alloc(size),當我們為一個Buffer對象分配空間大小以后,其長度是
固定的,不能更改

1 var bf = new Buffer(5);
2 console.log(bf); // <Buffer 00 00 00 00 00>
3 var bf1 = Buffer.alloc(5);
4 console.log(bf1); // <Buffer 00 00 00 00 00>

2. new Buffer(array),最新版本已經改用Buffer.from(array).一旦初始化固定的數組長度之后,
其長度是固定的,不能更改

1 var bf = new Buffer([1, 2, 3]);
2 console.log(bf); // <Buffer 01 02 03>
3 
4 var bf1 = Buffer.from([1, 2, 3]);
5 console.log(bf1); // <Buffer 01 02 03>

3. new Buffer(string, [encoding]),最新版本已經改用Buffer.from(string, [,encoding])

 1 var bf = new Buffer('china', 'utf-8');
 2 console.log(bf); // <Buffer 63 68 69 6e 61>
 3 
 4 var bf1 = Buffer.from('china', 'utf-8');
 5 console.log(bf1); // <Buffer 63 68 69 6e 61>
 6 
 7 
 8 for (var i = 0; i < bf.length; i++) {
 9   console.log(bf[i].toString(16)); // 63 68 69 6e 61
10   console.log(String.fromCharCode(bf[i]));// c h i n a
11 }

2.Buffer類的方法

1. buf.write(string, offset, length, encoding)

string: 要寫入的字符串
offset: 開始寫入的偏移量
length:要寫入的字節數
encoding: string的字符編碼,默認'utf-8'

1 var str = 'china';
2 var buf = Buffer.alloc(5);
3 buf.write(str, 0, 2);
4 console.log(buf); // <Buffer 63 68 00 00 00>

2. buf.toString(encoding, start, end)
encoding: 使用字符的編碼,默認為'utf-8'
start: 開始解碼的字節偏移量
end: 結束解碼的字節偏移量,默認buf.length

  1 var buf = Buffer.from('china'); 2 console.log(buf.toString('utf-8', 0, 2)); // ch 

3. buf.toJSON() 返回buf的JSON格式

  1 var buf = Buffer.from('china'); 2 console.log(buf.toJSON()); // { type: 'Buffer', data: [ 99, 104, 105, 110, 97 ] } 

4. buf.slice(start, end)
start: 開始切片的偏移量。默認為0
end: 結束切片的偏移量,默認為buf.length

1 var buf = Buffer.from('china');
2 var buf2 = buf.slice(0, 2);
3 console.log(buf2); // <Buffer 63 68>
4 // 注意:改變buf2時,buf也會發生變化

5.buf.copy()對buf進行拷貝

1 var buf = Buffer.from('china');
2 var buf2 = Buffer.alloc(10);
3 buf.copy(buf2);
4 console.log(buf2); // <Buffer 63 68 69 6e 61 00 00 00 00 00>
5 // 注意:改變buf不會改變buf2

3.類方法,靜態方法

 1 // 1.Buffer.isEncoding(encoding) 支持的編碼
 2 
 3 console.log(Buffer.isEncoding('utf-8')); // true
 4 console.log(Buffer.isEncoding('gbk')); // false
 5 console.log(Buffer.isEncoding('hex')); // true
 6 
 7 
 8 // 2.Buffer.isBuffer(obj) 判斷obj是否時Buffer對象
 9 var arr = [1, 2, 3];
10 var bf = new Buffer(10);
11 
12 console.log(Buffer.isBuffer(arr)); // false
13 console.log(Buffer.isBuffer(bf)); // true
14 
15 // 3.Buffer.byteLength(str) 獲取字符串的字節長度
16 
17 var str1 = 'china';
18 
19 console.log(str1.length); // 5
20 console.log(Buffer.byteLength(str1)); // 5
21 
22 var str2 = '中國';
23 
24 console.log(str2.length); // 2
25 console.log(Buffer.byteLength(str2, 'utf-8')); // 6
26 console.log(Buffer.byteLength(str2, 'ascii')); // 2
27 
28 
29 // 4.Buffer.contact(list, totalLength) 拼接兩個buffer
30 // list: buf數組
31 // totalLength: 合並后Buffer總長度
32 
33 var str1 = 'china',
34     str2 = '中國';
35 var list = [Buffer.from(str1), Buffer.from(str2)];
36 console.log(list); // [ <Buffer 63 68 69 6e 61>, <Buffer e4 b8 ad e5 9b bd> ]
37 
38 var bf = Buffer.concat(list, 15);
39 console.log(bf); // <Buffer 63 68 69 6e 61 e4 b8 ad e5 9b bd 00 00 00 00>

4.Buffer應用實例

1 process.stdout.write('請輸入:'); // 中國
2 
3 process.stdin.resume();
4 
5 process.stdin.on('data', function (chunk) {
6   console.log(chunk); // <Buffer e5 bc a0 e5 9b bd 0a>
7   console.log(chunk.toString()); // 中國
8 });

FileSystem 文件系統

該模塊是核心模塊,需要使用require導入后使用
該模塊提供了操作文件的一些API

1. fs.open(path, flags, [mode], callback) 異步打開文件

 1 /*
 2 * fs.open(path, flags, [mode], callback) 異步打開文件
 3 *
 4 * path: 要打開的文件路勁
 5 * flags: 打開文件的方式  讀/寫
 6 * mode: 設置文件的模式 讀/寫/執行
 7 * callback: 回調
 8 *      err: 文件打開失敗的錯誤保存在err里面,如果成功err為null
 9 *      fd: 被打開文件的標識
10 * */
11 
12 // 引入 fs 核心模塊
13 var fs = require('fs');
14 
15 // 1.打開一個存在的文件
16 
17 fs.open('1.txt', 'r', function (err, fd) {
18   console.log(err); // null
19   console.log(fd); // 3
20 });
21 
22 // 2.打開一個不存在的文件
23 
24 fs.open('2-new.txt', 'r', function (err, fd) {
25   console.log(err); // 返回錯誤對象
26   console.log(fd); // undefined
27 });

2. fs.openSync(path, flags, [mode]) 同步打開文件

 1 /*
 2 * fs.openSync(path, flags, [mode]) 同步打開文件
 3 *
 4 * path: 要打開的文件路勁
 5 * flags: 打開文件的方式  讀/寫
 6 * mode: 設置文件的模式 讀/寫/執行
 7 * */
 8 
 9 // 引入 fs 核心模塊
10 var fs = require('fs');
11 
12 var fd = fs.openSync('1.txt', 'r');
13 console.log(fd); // 3

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

 1 /*
 2 * fs.read(fd, buffer, offset, length, position, callback)
 3 *
 4 * fd: 通過open方法成功打開一個文件返回的編號
 5 * buffer: buffer對象
 6 * offset: 偏移量(放到buffer的開始位置)
 7 * length: 添加到buffer中的內容長度
 8 * position: 當前文件里面的位置
 9 * callback: 回調
10 *           err:
11 *           bytesRead: 返回buf的長度
12 *           buffer: 返回的buf
13 *
14 *
15 * */
16 
17 // 引入 fs 核心模塊
18 var fs = require('fs');
19 
20 fs.open('1.txt', 'r', function (err, fd) {
21   if (err) {
22     console.log('文件打開失敗');
23   } else {
24 
25     // 讀取文件
26     var bf1 = new Buffer(10);
27     console.log(bf1); // <Buffer 00 00 00 00 00 00 00 00 00 00>
28     fs.read(fd, bf1, 0, 4, null, function (err, bytesRead, buffer) {
29       console.log(bf1); // <Buffer 61 62 63 64 00 00 00 00 00 00>
30       console.log(bytesRead); // 4
31       console.log(buffer); // <Buffer 61 62 63 64 00 00 00 00 00 00>
32     })
33   }
34 });

4. fs.write(fd, buffer, offset, length, position, callback)

 1 /*
 2 * fs.write(fd, buffer, offset, length, position, callback)
 3 *
 4 * fd: 打開的文件
 5 * buffer: 要寫入的數據
 6 * offset: buffer對象中要寫入的數據的起始位置
 7 * length: 要寫入的buffer數據的長度
 8 * position: fd中的起始位置
 9 * callback: 回調
10 *         err: 錯誤提示
11 *         bytesWritten: 寫入的字節數
12 *         buffer: 返回寫入的buffer
13 *
14 * */
15 
16 
17 // 引入 fs 核心模塊
18 var fs = require('fs');
19 
20 fs.open('1.txt', 'r+', function (err, fd) {
21   if (err) {
22     console.log('打開文件失敗')
23   } else {
24     var bf = Buffer.from('123');
25     fs.write(fd, bf, 0, 2, 10, function (err, bytesWritten, buffer) {
26       console.log(err); // null
27       console.log(bytesWritten); // 2
28       console.log(buffer); // <Buffer 31 32 33>
29     })
30   }
31 });

5. fs.close(fd, callback) 關閉fs

 1 /*
 2 * fs.close(fd, callback)
 3 *
 4 * fd: 打開的文件
 5 * callback: 回調
 6 *
 7 * 注意: 打開文件操作完畢, 最后需要關閉文件
 8 * */
 9 
10 var fs = require('fs');
11 
12 fs.open('1.txt', 'r', function (err, fd) {
13   // TODO
14   fs.close(fd, function () {
15 
16   })
17 });

6.  fs.writeFile(file, data, options, callback) 給文件寫入數據

 1 /*
 2 * fs.writeFile(file, data, options, callback) 給文件寫入數據
 3 *
 4 * file: [string] | [Buffer] | [URL] | [integer]文件名或文件描述符
 5 * data: [string] | [Buffer] | [TypedArray] | [DataView]寫入數據
 6 * options:
 7 *     encoding: 默認'utf-8'
 8 *     mode: 默認0o666
 9 *     flag: 默認w
10 * callback:
11 *     err: 錯誤提示
12 *
13 * 注意: 如果文件不存在,即新建寫入
14 *
15 * */
16 
17 
18 var fs = require('fs');
19 
20 fs.writeFile('2-new.txt', 'china', function (err) {
21   console.log(err); // null
22 });

7.  fs.appendFile(path, data, option, callback)

 1 /*
 2 * fs.appendFile(path, data, option, callback)
 3 *
 4 * path: 文件名或文件描述符
 5 * data: 添加數據
 6 * option:
 7 *     encoding:
 8 *     mode:
 9 *     flag:
10 *  callback:
11 *     err:
12 *
13 * 注意: 文件不存在,即創建
14 * */
15 
16 var fs = require('fs');
17 
18 fs.appendFile('2-new.txt', '-very-good', function (err) {
19   console.log(err); // null
20 });

8. fs.exists(path, callback) 檢測文件是否存在

 1 /*
 2 * fs.exists(path, callback) 檢測文件是否存在
 3 *
 4 * path: 文件路徑
 5 * callback:
 6 *   exists: [boolean]
 7 *
 8 * */
 9 
10 var fs = require('fs');
11 var filename = '3.txt';
12 
13 // 異步模式
14 fs.exists(filename, function (exists) {
15   console.log(exists); // false
16 
17   if (!exists) { // 不存在
18     fs.writeFile(filename, 'china', function (err) {
19       if (err) {
20         console.log('出錯了');
21       } else {
22         console.log('創建新文件成功');
23       }
24     })
25   } else { // 存在
26     fs.appendFile(filename, '-good', function (err) {
27       if (err) {
28         console.log('新的內容追加失敗');
29       } else {
30         console.log('新內容追加成功');
31       }
32     })
33   }
34 
35 
36 });
37 
38 // 同步模式
39 if (!fs.existsSync(filename)) {
40   fs.writeFileSync(filename, 'china');
41   console.log('新文件創建成功');
42 } else {
43   fs.appendFileSync(filename, '-good');
44   console.log('追加內容成功');
45 }

9. fs.readFile(filename, options, callback) 異步讀取一個文件的全部內容

 1 /*
 2 * fs.readFile(filename, options, callback) 異步讀取一個文件的全部內容
 3 *
 4 * callback:
 5 *      err:
 6 *      data: 數據
 7 *
 8 * */
 9 
10 var fs = require('fs');
11 
12 fs.readFile('3.txt', function (err, data) {
13   if (err) {
14     console.log('文件讀取錯誤');
15   } else {
16     console.log(data.toString()); // china-good
17   }
18 })

10. fs.unlink(path, callback) 刪除指定文件

 1 /*
 2 * fs.unlink(path, callback) 刪除指定文件
 3 *
 4 * callback:
 5 *     err
 6 * */
 7 
 8 var fs = require('fs');
 9 
10 fs.unlink('3.txt', function (err) {
11   if (err) {
12     console.log('刪除失敗');
13   } else {
14     console.log('刪除成功');
15   }
16 })

11. fs.rename(oldPath, newPath, callback) 重命名

 1 /*
 2 * fs.rename(oldPath, newPath, callback) 重命名
 3 * oldPath: 老名字
 4 * newPath: 新名字
 5 * callback:
 6 *     err:
 7 * */
 8 
 9 var fs = require('fs');
10 
11 fs.rename('2-new.txt', '2-new.txt', function (err) {
12   if (err) {
13     console.log('重命名失敗');
14   } else {
15     console.log('重命名成功');
16   }
17 });

12. fs.stat(filename, callback) 獲取文件信息

 1 /*
 2 * fs.stat(filename, callback) 獲取文件信息
 3 *
 4 * filename: 文件
 5 * callback: 回調
 6 *
 7 * */
 8 
 9 var fs = require('fs');
10 
11 fs.stat('2-new.txt', function () {
12   console.log(arguments);
13 });

13. fs.watch(filename, option, listener) 監聽文件

 1 /*
 2 * fs.watch(filename, option, listener) 監聽文件
 3 *
 4 * listener: 回調函數
 5 *     eventType: 事件
 6 *     filename: 文件
 7 *
 8 * */
 9 
10 var fs = require('fs');
11 
12 var filename = '2-new.txt';
13 
14 fs.watch(filename, function (ev, fn) {
15   console.log(ev);
16 
17   if (fn) {
18     console.log(fn + '發生了改變');
19   } else {
20     console.log('....');
21   }
22 })

14. 文件夾操作

 1 /*
 2 * fs.mkdir(path, [mode], callback) 創建文件夾
 3 * */
 4 
 5 var fs = require('fs');
 6 
 7 fs.mkdir('./1', function () {
 8   console.log(arguments);
 9 });
10 
11 
12 /*
13 * fs.rmdir(path, [mode], callback) 刪除文件夾
14 *
15 * */
16 /*
17 fs.rmdir('./1', function () {
18   console.log(arguments);
19 });
20 */
21 
22 /*
23 * fs.readdir(filename, callback) 讀取文件夾
24 * */
25 fs.readdir('../第11節', function (err, fileList) {
26   fileList.forEach(function (f) {
27     fs.stat(f, function (err, info) {
28       switch (info.mode) {
29         case 16822:
30           console.log('[文件夾]' + f);
31           break;
32 
33         case 33206:
34           console.log('[文件]' + f);
35           break;
36 
37         default:
38           console.log('[其它類型]' + f);
39           break;
40       }
41     })
42   })
43 
44 
45 })

15. 前端項目自動化創建

 1 /*
 2 * 前端項目自動化創建
 3 * */
 4 
 5 var projectData = {
 6   name: 'project',
 7   fileData: [
 8     {
 9       name: 'css',
10       type: 'dir'
11     },
12     {
13       name: 'js',
14       type: 'dir'
15     },
16     {
17       name: 'images',
18       type: 'dir'
19     },
20     {
21       name: 'index.html',
22       type: 'file',
23       content: '<html>\n\t<head>\n\t\t<title>title</title>\n\t</head>\n\t<body>\n\t\t<div>Hello Node</div>\n\t</body>\n</html>'
24     },
25   ]
26 };
27 
28 var fs = require('fs');
29 
30 if (projectData.name) {
31   fs.mkdirSync(projectData.name);
32   var fileData = projectData.fileData;
33 
34   if (fileData && fileData.forEach) {
35     fileData.forEach(function (f) {
36 
37       f.path = projectData.name + '/' + f.name;
38 
39       switch (f.type) {
40         case 'dir':
41           fs.mkdirSync(f.path);
42           break;
43         case 'file':
44           fs.writeFileSync(f.path, f.content)
45           break;
46       }
47 
48     })
49   }
50 
51 
52 }

16. 自動合並文件

 1 /*
 2 * 自動合並
 3 * */
 4 var fs = require('fs');
 5 
 6 var fileDir = './project/source';
 7 
 8 fs.watch(fileDir, function (ev, file) {
 9   /*
10   * 這里不需要判斷file是否有內容
11   * 只要有一個文件發生了變化,我們就需要對這個文件夾
12   * 下得所有文件進行讀取,然后合並
13   * */
14   fs.readdir(fileDir, function (err, dataList) {
15 
16     var arr = [];
17 
18     dataList.forEach(function (f) {
19 
20       var info = fs.statSync(fileDir + '/' + f);
21 
22       if (info.mode === 33206) {
23         arr.push(fileDir + '/' + f);
24       }
25 
26     });
27 
28     // 讀取數組中得文件內容,並合並
29 
30     var content = '';
31     arr.forEach(function (f) {
32       var c = fs.readFileSync(f);
33       content += c.toString() + '\n';
34     })
35 
36     console.log(content);
37 
38     fs.writeFileSync('./project/js/index.js', content);
39 
40   });
41 
42 });

Http

1.用戶通過瀏覽器發送一個http的請求到指定的主機
2.服務器接收到該請求,對該請求進行分析和處理
3.服務器處理完成以后,返回對應的數據到用戶機器
4.瀏覽器接收服務器返回的數據,並根據接收到的進行分析和處理

客戶端 服務端
由客戶端發送一個http請求到指定的服務端
->
服務端接收並處理請求
->
返回數據到客戶端

 1 /*
 2 * 搭建一個http的服務器,用於處理用戶發送的http請求
 3 * 需要使用node提供的一個模塊  http
 4 */
 5 
 6 // 引入 http 核心模塊
 7 var http = require('http');
 8 
 9 // 通過http模塊下的createServer創建並返回一個web服務器對象
10 var server = http.createServer();
11 
12 // 監聽服務器錯誤
13 server.on('error', function (err) {
14   console.log('錯誤:', err);
15 });
16 
17 // 監聽
18 server.on('listening', function () {
19   console.log('listening.....')
20 });
21 
22 // 獲取請求
23 server.on('request', function (req, res) {
24   console.log('有客戶端請求了,url地址:', req.url);
25 
26   // 自定義添加響應給客戶端的頭部信息
27   res.setHeader('name', 'winner');
28 
29   // 響應給客戶端的頭部信息(只能在res.setHeader()之后和res.end()之前調用)
30   res.writeHead(200, 'ok', {
31     'content-type': 'text/html;charset=utf-8', // 告訴客戶端返回信息的形式
32   });
33 
34   // 響應發送給客戶端的內容
35   res.write('<h1>Hello World</h1>');
36   // 響應發送給客戶端
37   res.end();
38 
39 });
40 
41 // 監聽端口號
42 server.listen(3000);

url處理

 1 /*
 2 * url的處理
 3 * */
 4 
 5 // 引入 http 核心模塊
 6 var http = require('http');
 7 // 引入 url 核心模塊
 8 var url = require('url');
 9 
10 
11 // 通過http模塊下的createServer創建並返回一個web服務器對象
12 var server = http.createServer();
13 
14 // 監聽服務器錯誤
15 server.on('error', function (err) {
16   console.log('錯誤:', err);
17 });
18 
19 // 監聽
20 server.on('listening', function () {
21   console.log('listening.....')
22 });
23 
24 // 獲取請求
25 server.on('request', function (req, res) {
26   // req.url: 訪問路徑
27   // ?后面的部分 query string
28   var urlStr = url.parse(req.url);
29   // console.log(urlStr);
30 
31   switch (urlStr.pathname) {
32     case '/':
33       // 首頁
34       res.writeHead(200, {
35         'content-type': 'text/html;charset=utf-8'
36       });
37       res.end('<h1>這是首頁</h1>');
38       break;
39     case '/user':
40       //用戶首頁
41       res.writeHead(200, {
42         'content-type': 'text/html;charset=utf-8'
43       });
44       res.end('<h1>這是個人中心</h1>');
45       break;
46     default:
47       // 處理其它情況
48       res.writeHead(404, {
49         'content-type': 'text/html;charset=utf-8'
50       });
51       res.end('<h1>頁面被LEO吃掉了</h1>');
52       break;
53   }
54 
55 });
56 
57 // 監聽端口號
58 server.listen(3000);

get和post請求

  1 /*
  2 * 使用fs模塊實現行為表現分離
  3 * */
  4 
  5 // 引入 http 核心模塊
  6 var http = require('http');
  7 
  8 // 引入 url 核心模塊
  9 var url = require('url');
 10 
 11 // 引入 fs 核心模塊
 12 var fs = require('fs');
 13 
 14 // 引入 querystring 核心模塊
 15 var qs = require('querystring');
 16 
 17 // 引入 __dirname 功能
 18 var HtmlDir = __dirname + '/html/'
 19 
 20 // 通過http模塊下的createServer創建並返回一個web服務器對象
 21 var server = http.createServer();
 22 
 23 // 監聽服務器錯誤
 24 server.on('error', function (err) {
 25   console.log('錯誤:', err);
 26 });
 27 
 28 // 監聽
 29 server.on('listening', function () {
 30   console.log('listening.....')
 31 });
 32 
 33 // 獲取請求
 34 server.on('request', function (req, res) {
 35   // req.url: 訪問路徑
 36   // ?后面的部分 query string
 37   var urlStr = url.parse(req.url);
 38   console.log('有客戶端訪問了!');
 39 
 40 
 41   switch (urlStr.pathname) {
 42     case '/':
 43       // 首頁
 44       sendData(HtmlDir + 'index.html', req, res);
 45       break;
 46     case '/user':
 47       //用戶首頁
 48       sendData(HtmlDir + 'user.html', req, res);
 49       break;
 50     case '/login':
 51       //用戶首頁
 52       sendData(HtmlDir + 'login.html', req, res);
 53       break;
 54     case '/login/check':
 55       //登錄請求
 56       if (req.method.toUpperCase() === 'POST') {
 57 
 58         var str = '';
 59 
 60         req.on('data', function (chunk) {
 61           str += chunk;
 62         });
 63 
 64         req.on('end', function () {
 65           console.log(qs.parse(str));
 66         });
 67         res.writeHead(200, {
 68           'content-type': 'text/html;charset=utf-8'
 69         });
 70         res.end('歡迎');
 71       } else {
 72         console.log(qs.parse(urlStr.query)); // get請求
 73       }
 74 
 75 
 76       break;
 77     default:
 78       // 處理其它情況
 79       sendData(HtmlDir + 'other.html', req, res);
 80       break;
 81   }
 82 
 83 });
 84 
 85 function sendData(file, req, res) {
 86   fs.readFile(file, function (err, data) {
 87     if (err) {
 88       res.writeHead(404, {
 89         'content-type': 'text/html;charset=utf-8'
 90       });
 91       res.end('<h1>頁面被LEO吃掉了</h1>');
 92     } else {
 93       res.writeHead(200, {
 94         'content-type': 'text/html;charset=utf-8'
 95       });
 96       res.end(data);
 97     }
 98   })
 99 }
100 
101 // 監聽端口號
102 server.listen(3000);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM