Node

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');
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Node.js是目前非?;馃岬募夹g(shù),但是它的誕生經(jīng)歷卻很奇特。 眾所周知,在Netscape設(shè)計(jì)出JavaScri...
    Myselfyan閱讀 4,191評(píng)論 2 58
  • 個(gè)人入門學(xué)習(xí)用筆記、不過多作為參考依據(jù)。如有錯(cuò)誤歡迎斧正 目錄 簡(jiǎn)書好像不支持錨點(diǎn)、復(fù)制搜索(反正也是寫給我自己看...
    kirito_song閱讀 2,648評(píng)論 1 37
  • 模塊化公布自己的模塊功能. 其他模塊調(diào)用另外的模塊. 公布方法 如果要輸出一個(gè)鍵值對(duì)象{},可以利用exports...
    httIsHere閱讀 593評(píng)論 0 0
  • 最近,關(guān)于“努力”的文不少,從作者的視角看到了現(xiàn)今人們的各種狀態(tài)。印象很深的一句話是“你只是看起來很努力”。想到自...
    熹尤閱讀 418評(píng)論 0 0
  • 5點(diǎn),鬧鐘把我從睡夢(mèng)中叫醒,看看外面霧蒙蒙的陰著天。有點(diǎn)不想起了,可是一想到昨天才立下的志愿,今天就放棄,簡(jiǎn)直就是...
    紅紅的火焰V閱讀 141評(píng)論 0 3

友情鏈接更多精彩內(nèi)容