您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)node.js中怎么注冊(cè)服務(wù)器端,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
模塊
node.js中最強(qiáng)的莫過于“模塊化”了。各式各樣的模塊,諸如:http、https、fs…層出不窮,而且直接調(diào)用,簡(jiǎn)單便捷。
引入方式:
const 變量名 = require('模塊名');
比如,本demo所用到的:
const http=require('http')
const url=require('url')
const querystring=require('querystring') //“解析數(shù)據(jù)” 模塊
const fs=require('fs')
其中fs算是node中比較重要的模塊了,只要涉及文件讀取,都要用到它。。。
開始
首先,因?yàn)闆]搞數(shù)據(jù)庫(kù),我們用一個(gè)對(duì)象來模擬一下:
let user={
admin:123456
}
(此代碼作用:規(guī)定必須是這種格式的存取)
然后,我們需要和瀏覽器交互——交互即需發(fā)請(qǐng)求——請(qǐng)求在node中需用到http/https
即我們需要寫一個(gè)服務(wù)器程序 -> http.createServer(function(response,request){}).listen(端口號(hào))
這個(gè)函數(shù)內(nèi)置一個(gè)回調(diào)函數(shù),其接收兩個(gè)參數(shù):請(qǐng)求(request)和響應(yīng)(response)、最后還有一個(gè)listen監(jiān)聽函數(shù),負(fù)責(zé)告訴服務(wù)器“目標(biāo)是誰”;
在其中,需要判斷請(qǐng)求方式——因?yàn)椴荒苷f登錄注冊(cè)兩種方式就放兩個(gè)服務(wù)器上是吧(你也得看人家服務(wù)器愿不愿意啊)
//獲取數(shù)據(jù)
let path,get,post
if(req.method=='GET'){
//es6語法:解構(gòu)
let {pathname,query}=url.parse(req.url,true) //parse ——url塊 的方法——解析鏈接(req.url,和是否解析query部分(true))
path=pathname
get=query
complete()
}else if(req.method=='POST'){
let arr=[]
path=req.url //因?yàn)閜ost傳參不在url展示,故其url要簡(jiǎn)便很多,直接取出即可
//data 事件——post請(qǐng)求 請(qǐng)求數(shù)據(jù)(buffer指代二進(jìn)制數(shù)據(jù)流)
req.on('data',buffer=>{
arr.push(buffer)
})
//end事件——數(shù)據(jù)處理結(jié)束后的回調(diào)函數(shù)
req.on('end',()=>{
//Buffer.concat——依托于Buffer對(duì)象中的concat方法,將arr數(shù)組數(shù)據(jù)“拼接”起來(也可以理解為:擺脫數(shù)組形態(tài))
//toString()——任何數(shù)據(jù)都可以字符串化
//querystring——字符串解析->JSON格式
post=querystring.parse(Buffer.concat(arr).toString())
complete()
})
}
好了,get和post里都獲取到數(shù)據(jù)了,接下來要對(duì)數(shù)據(jù)進(jìn)行處理了,因?yàn)樘幚聿襟E是相同的,我們就把其放在一個(gè)函數(shù)(complete)中,再分別在get和post里調(diào)用(第7、20行)。
等等,我們說下 buffer ——二進(jìn)制數(shù)據(jù)流
為什么要對(duì)其進(jìn)行 Buffer.concat 操作? 我們來看一段代碼:
let http=require('http')
http.createServer((req,res)=>{
let result=[]
req.on('data',buffer=>{
result.push(buffer)
})
req.on('end',()=>{
console.log(result)
})
}).listen(8888)
它的結(jié)果是個(gè)名為Buffer的數(shù)組
而加上Buffer.concat以后,就變成了字符串形式:
然后我們就可以對(duì)其 querystring轉(zhuǎn)換為對(duì)象格式 ,然后取出數(shù)據(jù)了
API
寫過文檔(或者看過后端寫文檔)的都知道,寫后端比較重要的就是寫一個(gè)API調(diào)用文檔——告訴前端,你需要往哪里發(fā)請(qǐng)求,需要傳什么,接收什么,字段有哪些,以什么方式。
這里,我們規(guī)定——err為1,代表有錯(cuò);反之,代表通過。提示信息寫在msg中,通過end函數(shù)返回給頁面:
function complete(){
if(path=='/login'){
res.writeHead(200,{
"Content-Type":"text/plain;charset=utf-8"
})
let {username,password}=get
if(!user[username]){
//end :只能用字符串(這里必須用stringify轉(zhuǎn)一下)
res.end(JSON.stringify({
err:1,
msg:"用戶名不存在"
}))
}else if(user[username]!=password){
res.end(JSON.stringify({
err:1,
msg:"密碼錯(cuò)誤"
}))
}else{
res.end(JSON.stringify({
err:0,
msg:"登錄成功"
}))
}
}else if(path=='/reg'){
res.writeHead(200,{
"Content-Type":"text/plain;charset=utf-8"
})
let {username,password}=post //把“新增的”數(shù)據(jù)取出
if(user[username]){ // ↑ 放到user中
res.end(JSON.stringify({
err:1,
msg:"賬戶已存在"
}))
}else{
user[username]=password
res.end(JSON.stringify({
err:0,
msg:"注冊(cè)成功"
}))
}
}else{
//如果既不是登錄也不是注冊(cè)——?jiǎng)偞蜷_頁面的時(shí)候!(這一步至關(guān)重要:判斷頁面路徑是否正確)
fs.readFile(`www${path}`,(err,data)=>{
if(err){
res.end('404')
}else{
res.end(data)
}
})
}
}
我們來分析一下:
res.writeHead(200,{
"Content-Type":"text/plain;charset=utf-8"
})
代碼中這一部分和java寫后端中的:
response.setHeader("Content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
是一樣的效果——規(guī)范字體格式
還有一點(diǎn)要注意的是:end函數(shù)——只接受字符串形式,故常用JSON.stringify()來轉(zhuǎn)換。
下面把HTML代碼放上:
(關(guān)于這個(gè)jQuery包的下載,很好玩:在命令行里輸入npm i jquery,回車,即可(前提是你得下載了node))
用戶名:
密碼:
登錄
注冊(cè)
做完這一切,在命令行輸入:node js文件完整路徑,然后打開瀏覽器,輸入:localhost:監(jiān)聽的端口號(hào)/html文件名,即可測(cè)試
看完上述內(nèi)容,你們對(duì)node.js中怎么注冊(cè)服務(wù)器端有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。