Node中文網(wǎng):http://Nodejs.cn/
(一)全局變量global
- node中有一個(gè)全局變量global,是node中最大的一個(gè)對(duì)象,相當(dāng)于瀏覽器中的window對(duì)象。
- global中的成員在使用時(shí),可以省略global,這點(diǎn)也類似瀏覽器中的window
global中的成員
- console,不是瀏覽器中的console對(duì)象,是node中的console
- process,和進(jìn)程相關(guān)的對(duì)象
- setInterval,同理,也是node中的,不是瀏覽器中的
- require(),它是全局對(duì)象global中的一個(gè)方法,用于在js文件中引入另外的文件
- __dirname,當(dāng)前執(zhí)行文件的絕對(duì)路徑(在js文件中使用)
- __filename,當(dāng)前執(zhí)行文件的絕對(duì)路徑,包含文件名(在js文件中使用)
console.log(123);
if (5 > 4) {
console.log('大于');
}
global.console.log(1234);
global.setTimeout(() => {
console.log('suibian');
}, 2000);
console.log(__dirname);
console.log(__filename);
//輸出結(jié)果
//123
//大于
//1234
///Users/lisiyi/AJAX/code/public
///Users/lisiyi/AJAX/code/public/demo.js
//suibian
(二)Node核心模塊
要使用一個(gè)模塊的話必須先加載(引入)該模塊。
1.path模塊(處理路徑模塊)
- 操作文件的時(shí)候經(jīng)常要對(duì)文件的路徑做處理,或者獲取文件的后綴,使用
path模塊。 -
path是 Node 本身提供的 API,專門用來處理路徑。 -
path僅僅用來處理路徑的字符串,不一定存在對(duì)應(yīng)的物理文件。
使用方法:
// 使用核心模塊之前,首先加載核心模塊
let path = require('path');
// 或者
const path = require('path');
path模塊中的方法:

代碼舉栗:
const path = require('path');
// extname -- 獲取文件后綴
console.log(path.extname('index.html')); // .html
console.log(path.extname('index.coffee.md')); // .md
// join -- 智能拼接路徑
console.log(path.join('/a', 'b', 'c')); // \a\b\c
console.log(path.join('a', 'b', 'c')); // a\b\c
console.log(path.join('/a', '/b/../c')); // \a\c
console.log(path.join('/a', 'b', 'index.html')); // \a\b\index.html
console.log(path.join(__dirname, 'a', 'index.html')); // 得到一個(gè)絕對(duì)路徑
2.fs模塊(文件操作模塊)
引入模塊的時(shí)候,可以使用var、let,但是建議使用const,因?yàn)槲覀儾幌M淖儭?/p>
//加載模塊,得到一個(gè)對(duì)象。
const fs = require('fs');
console.log(fs);
readFile異步讀取文件。其中[編碼]可選,默認(rèn)輸出buffer類型的數(shù)據(jù)。
const fs = require('fs');
// fs.readFile(文件路徑, [編碼], 回調(diào)函數(shù)處理讀取的內(nèi)容);
fs.readFile('index.html', 'utf-8', (err, data) => {
//err表示是否有錯(cuò)誤,有錯(cuò)誤的話err表示錯(cuò)誤信息,是一個(gè)字符串。沒有錯(cuò)誤err是undefined
if (err) {
console.log(err); //若有錯(cuò)誤,輸出錯(cuò)誤
return; //阻止后續(xù)代碼
}
console.log(data); //輸出讀取的內(nèi)容
});
writeFile異步寫入文件。會(huì)將文件中原有的內(nèi)容覆蓋掉。若寫入文件不存在,則會(huì)自動(dòng)創(chuàng)建文件。
const fs = require('fs');
// 調(diào)用writeFile方法,寫入文件
// fs.writeFile(文件路徑,寫入的內(nèi)容,回調(diào)函數(shù)查看是否有錯(cuò)誤);
fs.writeFile('demo.txt', 'how are you', (err) => {
if (err) {
console.log(err);
}
else {
console.log('success');
}
})
3.querystring模塊(查詢字符串處理模塊)
//加載模塊
const querystring = require('querystring');
// parse方法是將查詢字符串轉(zhuǎn)換成JS對(duì)象,是querystring對(duì)象中封裝的,不是JSON.parse。
let result = querystring.parse('id=123&name=zs&age=20');
console.log(result); // { id: '123', name: 'zs', age: '20' }
console.log(querystring.stringify(result)); //id=123&name=zs&age=20
4.url模塊
舊的API使用:
const url = require('url');
//let res = url.parse('http://www.baidu.com:80/test.html?id=123&age=20');
let res = url.parse('test.html?id=123&age=20'); //url不完整也可以解析
console.log(res); //解析出一個(gè)對(duì)象
//獲取參數(shù)
console.log(res.query); //id=123&age=20
//引入querystring處理res.query
const querystring = require('querystring');
console.log(querystring.parse(res.query)); //{ id: '123', age: '20' }
新的API使用:實(shí)例化URL的時(shí)候,必須傳遞一個(gè)完整的url,否則會(huì)報(bào)錯(cuò)
const myUrl = new URL('http://www.baidu.com/test.html?id=123&age=20');
// const myUrl = new URL('test.html?id=123&age=20'); //報(bào)錯(cuò),無效的url
//傳兩個(gè)參數(shù)組成完整的url,不會(huì)報(bào)錯(cuò)
// const myUrl = new URL('test.html?id=123&age=20', 'http://www.xyz.com');
console.log(myUrl); //解析出一個(gè)對(duì)象,包含了url的各個(gè)組成部分
//比舊的API多了searchParams
console.log(myUrl.searchParams); //URLSearchParams { 'id' => '123', 'age' => '20' }
//獲取id參數(shù)
console.log(myUrl.searchParams.id); //undefined
console.log(myUrl.searchParams.get('id')); //必須調(diào)用searchParams對(duì)象中的get方法來獲取
(三)http模塊(服務(wù)器處理模塊)
node不同于Apache,安裝完node并沒有一個(gè)能夠提供Web服務(wù)環(huán)境,需要使用http模塊自己來搭建Web服務(wù)器。
- http是一個(gè)系統(tǒng)模塊,讓我們能夠通過簡(jiǎn)單的流程創(chuàng)建一個(gè)Web服務(wù)器。
1.使用http模塊搭建Web服務(wù)器
//加載http模塊
const http = require('http');
//調(diào)用http模塊中的createServer方法,創(chuàng)建服務(wù)器
const server = http.createServer();
//啟動(dòng)服務(wù)器,并且要為服務(wù)器設(shè)置端口
server.listen(3000, () => {
console.log('服務(wù)器啟動(dòng)了');
});
//添加request事件,用于處理所有的http請(qǐng)求
server.on('request', () => {
console.log('你的請(qǐng)求我收到了');
});
2.如何對(duì)瀏覽器的請(qǐng)求作出響應(yīng)
const http = require('http');
const server = http.createServer();
server.listen(3000, () => {
console.log('服務(wù)器啟動(dòng)了');
});
server.on('request', (req, res) => {
//事件處理函數(shù)有兩個(gè)參數(shù)
//req表示request,所有和請(qǐng)求相關(guān)的信息都可以通過request對(duì)象來接收
//res表示response,所有和響應(yīng)相關(guān)的都可以使用response對(duì)象來處理
console.log('你的請(qǐng)求我收到了');
//通過res.setHeader()方法來設(shè)置響應(yīng)頭,若不設(shè)置會(huì)出現(xiàn)中文亂碼
res.setHeader('Content-Type','text/html; charset=utf-8');
//通過res對(duì)象的end方法來對(duì)瀏覽器作出響應(yīng)
//res.end()方法的作用是將響應(yīng)報(bào)文(行、頭、體)返回給瀏覽器
res.end('你的請(qǐng)求我收到了');
});
3.根據(jù)不同url處理不同請(qǐng)求
const http = require('http');
const server = http.createServer();
server.listen(8000, () => console.log('start'));
server.on('request', (req, res) => {
/*
req.url 表示請(qǐng)求的url,形如/index.html
req.method 表示請(qǐng)求方式,比如GET
req.headers 表示所有的請(qǐng)求頭,是一個(gè)對(duì)象
*/
let url = req.url;
//判斷,根據(jù)url返回信息
if (url === 'index.html') {
//讀取index.html并返回內(nèi)容
res.setHeader('content-type', 'text/html;charset=utf-8');
res.end('你請(qǐng)求的是index.html');
}
else if (url === '/getMsg') {
//讀取數(shù)據(jù)并返回
res.setHeader('content-type', 'text/html;charset=utf-8');
res.end('你請(qǐng)求的是getMsg接口')
}
else {
//服務(wù)器沒有瀏覽器請(qǐng)求的文件或接口
res.setHeader('content-type', 'text/html;charset=utf-8');
res.statusCode = 404; //不存在,設(shè)置狀態(tài)碼為404
res.end('你請(qǐng)求的文件不存在')
}
})
4.處理瀏覽器POST方式提交的數(shù)據(jù)
const http = require('http');
const server = http.createServer();
server.listen(8000, () => console.log('start'));
server.on('request', (req, res) => {
//判斷是否是POST方式請(qǐng)求
if (req.method === 'POST' && req.url === '/addMsg') {
console.log(1234);
//服務(wù)器端接收數(shù)據(jù)的時(shí)候是分塊接收的
//需要data事件,將瀏覽器發(fā)送過來的數(shù)據(jù)拼接到一起
let str = '';
req.on('data', (chunk) => {
str += chunk;
});
//如果已經(jīng)將全部數(shù)據(jù)接收到了,則觸發(fā)end事件,在這個(gè)事件中可以獲取到所有數(shù)據(jù)
req.on('end', () => {
console.log(str);
});
}
})
使用postman測(cè)試:

終端輸出結(jié)果:
1234
name=lisiyi&content=imlisiyi
5.處理外部靜態(tài)資源
為不同的文件類型設(shè)置不同的 Content-Type
- .html:text/html
- .css:text/css
- .js:application/javascript
- .jpg:image/jpg
response.setHeader('Content-Type', 'text/css');