前言:自從下決心轉(zhuǎn)學(xué)前端以來氧猬,我的專業(yè)課java基本荒廢了,所以對(duì)于后臺(tái)開發(fā)的邏輯也已基本忘干凈了坏瘩。但是作為一名準(zhǔn)前端程序猿,我認(rèn)為還是有必要了解后端開發(fā)的漠魏,雖不必深入學(xué)習(xí)倔矾,但是能夠了解項(xiàng)目從前端到后端的整個(gè)流程,實(shí)現(xiàn)簡(jiǎn)單的業(yè)務(wù)邏輯(增刪改查)應(yīng)該對(duì)我們大有裨益柱锹。NodeJS應(yīng)該說是前端開發(fā)人員涉及后端開發(fā)的最佳選擇哪自,因?yàn)槭褂玫氖乔岸撕苁煜さ腏avascript語言。
一禁熏、什么是Node.js
Node.js是一個(gè)基于V8引擎的服務(wù)器端Javascript運(yùn)行環(huán)境壤巷。Javascript(簡(jiǎn)稱JS,下同)從此有了開發(fā)后段應(yīng)用程序的能力瞧毙。
因?yàn)槭褂玫氖荍S語言胧华,所以一發(fā)布以來就受到了廣大前端開發(fā)人員的喜愛。很多前端開發(fā)人員開始涉足后端開發(fā)宙彪,使用Node.js重構(gòu)前端工具矩动。
Node.js通過非阻塞I/O流、事件驅(qū)動(dòng)機(jī)制展現(xiàn)了它超強(qiáng)的高并發(fā)能力释漆。此外悲没,Node使用的是高性能的V8引擎,提供了很多不同用途的API,采用全新的編譯技術(shù)男图,實(shí)現(xiàn)了一個(gè)高性能的服務(wù)器示姿。
二甜橱、Node.js環(huán)境安裝
Node.js的環(huán)境安裝十分簡(jiǎn)單,去官網(wǎng) http://nodejs.org/en/ 下載穩(wěn)定版本安裝包栈戳,點(diǎn)擊下一步下一步安裝即可岂傲。
完成以后可以打開CMD輸入node -v
查看是否安裝成功:
C:\Users\dawei>node -v
v6.11.1
出現(xiàn)node的版本號(hào)則表示安裝成功。
現(xiàn)在我們就開始學(xué)習(xí)Nodejs荧琼。Node.js中譬胎,將很多功能劃分為一個(gè)個(gè)module
(模塊)。Node.js中的很多功能都是通過模塊來實(shí)現(xiàn)的命锄。
三堰乔、http模塊
HTTP
模塊用于創(chuàng)建服務(wù)器,接收和響應(yīng)客戶端的請(qǐng)求脐恩。
//1镐侯、引入http模塊
var http = require('http');
//創(chuàng)建服務(wù)器
var server = http.createServer(function (req , res) {
//發(fā)送HTTP頭部
//HTTP狀態(tài)碼:200:OK
//設(shè)置HTTP頭部,狀態(tài)碼是200驶冒,文件類型是html苟翻,字符集是utf-8
res.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"});
//發(fā)送相應(yīng)數(shù)據(jù)
res.write("Hello Node.js");
//結(jié)束處理程序,返回?cái)?shù)據(jù)
res.end();
});
server.listen(8080); //監(jiān)聽端口
//在終端打印如下信息骗污,提示服務(wù)器已啟動(dòng)
console.log("Server running at http://127.0.0.1:8080/");
這樣我們就完整的創(chuàng)建了一個(gè)web服務(wù)器崇猫,可以在瀏覽器通過http://127.0.0.1:8080
訪問該服務(wù)器。
回調(diào)函數(shù)中的req
對(duì)象包含了客戶端請(qǐng)求的信息需忿,可以使用req.url
屬性拿到用戶請(qǐng)求的URL地址诅炉,在后期我們就是要通過不同的URL來設(shè)計(jì)不同的路由。那么識(shí)別這個(gè)URL屋厘,就用到了URL
模塊涕烧。
四、URL模塊
URL模塊提供了幾個(gè)方法用于操作url汗洒。
- url.parse(req.url):解析url议纯,將url地址轉(zhuǎn)為url對(duì)象
- url.format():將url對(duì)象轉(zhuǎn)為url字符串,是
parse
方法的逆向操作 - url.resolve(from,to) :添加或者替換路由
1溢谤、url.parse()
假設(shè)在上面的代碼段中引入了url模塊
url.parse(req.url)
那么將會(huì)打印如下內(nèi)容
{
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: null,
query: null,
pathname: '/',
path: '/',
href: '/' }
由于我們只是訪問了根路徑瞻凤,所以內(nèi)容基本為空,很多情況下我們需要訪問詳細(xì)的頁面并且傳遞參數(shù)
http://127.0.0.1:8080/login.html?uaername=dawei&pass=123
{
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '?uaername=dawei&pass=123',
query: 'username=dawei&pass=123',
pathname: '/login.html',
path: '/login.html?uaername=dawei&pass=123',
href: '/login.html?uaername=dawei&pass=123' }
可以看到溯香,這個(gè)對(duì)象的query
屬性保存了我們的參數(shù)鲫构,也叫做查詢字符串。pathname
屬性中保存了我們的訪問路徑玫坛。這兩個(gè)屬性很常用结笨。
我們往往需要獲取參數(shù)信息,在服務(wù)器端做進(jìn)一步處理。在JS中我們可以使用字符串截取來獲取參數(shù)炕吸,不過再這里我們可以直接給parse
方法傳遞一個(gè)參數(shù)true
來將查詢字符串轉(zhuǎn)為對(duì)象格式伐憾,從而很方便的獲取。
url.parse(req.url,true)
{
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '?username=dawei&pass=123',
query: { username: 'dawei', pass: '123' },
pathname: '/login.html',
path: '/login.html?username=dawei&pass=123',
href: '/login.html?username=dawei&pass=123' }
這樣我們就可以很方便的獲取參數(shù)的值赫模。
2树肃、url.resolve()
a、增加路由
var a = url.resolve('http://example.com/', '/one');
console.log(a); // http://example.com/one
b瀑罗、替換路由
var b = url.resolve('http://example.com/one', '/two');
console.log(b); // http://example.com/two