如何利用Node.js與JSON搭建簡(jiǎn)單的動(dòng)態(tài)服務(wù)器
一、創(chuàng)建html頁(yè)面
創(chuàng)建4個(gè)頁(yè)面,index.html、register.html、sign_in.html、home.html
- index.html 默認(rèn)主頁(yè)
- register.html 用于注冊(cè)賬號(hào)
- sign_in.html 用于登錄賬號(hào)
- home.html 用于顯示登錄后的頁(yè)面
主要代碼片段
register.html
<form id="registerForm">
<div>
<label for="">用戶(hù)名:<input type="text" name="name" id=""></label>
</div>
<div>
<label for="">密碼:<input type="password" name="password" id=""></label>
</div>
<div>
<button type="submit">注冊(cè)</button>
</div>
</form>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
let $form = $('#registerForm')
$form.on('submit', (e) => {
e.preventDefault()
const name = $form.find("input[name=name]").val()
const password = $form.find('input[name=password').val()
console.log(name, password)
// pass AJAX post data
$.ajax({
method: 'post',
url: '/register',
contentType: 'text/json; charset=UTF-8',
data: JSON.stringify({
name, // name: name
password // password: password
})
}).then(() => {
alert('注冊(cè)成功')
location.href = '/sign_in.html'
}, () => {})
})
</script>
sign_in.html
<form id="signInForm">
<div>
<label for="">用戶(hù)名:<input type="text" name="name" id=""></label>
</div>
<div>
<label for="">密碼:<input type="password" name="password" id=""></label>
</div>
<div>
<button type="submit">登錄</button>
</div>
</form>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
let $form = $('#signInForm')
$form.on('submit', (e) => {
e.preventDefault()
// get name password
const name = $form.find("input[name=name]").val()
const password = $form.find('input[name=password').val()
// pass AJAX post data
$.ajax({
method: 'POST',
url: '/sign_in',
contentType: 'text/json; charset=UTF-8',
data: JSON.stringify({
name,
password
})
}).then(() => {
alert('登錄成功')
location.href = '/home.html'
}, () => {})
})
</script>
home.html
<p>
{{loginStatus}}
</p>
<p>
你好,{{user.name}}
</p>
<p>
<a href="sign_in.html">登錄</a>
</p>
二、Node服務(wù)器
var http = require('http')
var fs = require('fs')
var url = require('url')
var port = process.argv[2]
if (!port) {
console.log('請(qǐng)輸入指定端口。如:\nnode server.js 8888')
process.exit(1)
}
var server = http.createServer(function (request, response) {
var parsedUrl = url.parse(request.url, true)
var pathWithQuery = request.url
var queryString = ''
if (pathWithQuery.indexOf('?') >= 0) {
queryString = pathWithQuery.substring(pathWithQuery.indexOf('?'))
}
var path = parsedUrl.pathname
var query = parsedUrl.query
var method = request.method
/******** main start ************/
// 讀取 session 文件,轉(zhuǎn)化為對(duì)象
const session = JSON.parse(fs.readFileSync('./session.json').toString())
if (path === '/sign_in' && method === 'POST') {
// 讀數(shù)據(jù)庫(kù)
let userArray = JSON.parse(fs.readFileSync('./database/users.json'))
const array = []
// 每次接受數(shù)據(jù)就添加進(jìn)數(shù)組
request.on('data', (chunk) => {
array.push(chunk)
})
request.on('end', () => {
// 轉(zhuǎn)化字符串
const string = Buffer.concat(array).toString()
// 在轉(zhuǎn)化為對(duì)象
const obj = JSON.parse(string)
// 找到符合的 user
const user = userArray.find(user => user.name === obj.name && user.password === obj.password) // 成功返回符合的對(duì)象,失敗返回undefined
if (user === undefined) { // 失敗
response.statusCode = 400
response.setHeader('content-Type', 'text/JSON; charset=UTF-8')
response.end(`{"errorCode":4001}`)
} else { // 成功
response.statusCode = 200
// 設(shè)置 Cookie
const random = Math.random()
session[random] = {
user_id: user.id
}
// 寫(xiě)入數(shù)據(jù)
fs.writeFileSync('./session.json', JSON.stringify(session))
response.setHeader("Set-Cookie", `'session_id=${random}; HttpOnly'`)
response.end()
}
})
} else if (path === '/home.html') {
// 獲取 Cookie
const cookie = request.headers['cookie']
let sessionId
try { // 讀取 Cookie 中的 id 值
sessionId = cookie.split(';').filter(s => s.indexOf('session_id=') >= 0)[0].split('=')[1]
} catch (error) {}
if (sessionId && session[sessionId]) {
// 從 session 中讀取對(duì)應(yīng)的值
const userId = session[sessionId].user_id
// 讀數(shù)據(jù)庫(kù)
let userArray = JSON.parse(fs.readFileSync('./database/users.json'))
// 找到符合的 user
let user = userArray.find(user => user.id === userId)
const homeHtml = fs.readFileSync('./public/home.html').toString()
let string
if (user) {
string = homeHtml.replace('{{loginStatus}}', '已登錄').replace('{{user.name}}', user.name)
response.write(string)
}
} else {
// 讀取源文件內(nèi)容
const homeHtml = fs.readFileSync('./public/home.html').toString()
// 替換文字
const string = homeHtml.replace('{{loginStatus}}', '未登錄').replace('{{user.name}}', '')
response.write(string)
}
response.end()
} else if (path === '/register' && method === 'POST') {
response.setHeader('Content-Type', 'text/html; charset=UTF-8')
// read database
let userArray = JSON.parse(fs.readFileSync('./database/users.json')) // read database
const array = []
request.on('data', (chunk) => {
array.push(chunk)
})
request.on('end', () => {
// convert string
const string = Buffer.concat(array).toString()
// convert obj
const obj = JSON.parse(string)
// last user id
const lastUser = userArray[userArray.length - 1]
// new user
const newUser = {
id: lastUser ? lastUser.id + 1 : 1,
name: obj.name,
password: obj.password
}
userArray.push(newUser)
// write data
fs.writeFileSync('./database/users.json', JSON.stringify(userArray))
})
response.end()
} else {
response.statusCode = 200
let content
// setting index
const filePath = path === '/' ? '/index.html' : path
// judge type
const index = filePath.lastIndexOf('.')
const suffix = filePath.substring(index)
const fileType = {
'.html': 'text/html',
'.css': 'text/css',
'.js': 'text/javascript'
}
response.setHeader('Content-Type', `${fileType[suffix] || "text/html"};charset=utf-8`)
try {
content = fs.readFileSync(`./public${filePath}`)
} catch (error) {
content = '文件路徑不存在'
response.statusCode = 404
}
response.write(content)
response.end()
}
/******** main end ************/
})
server.listen(port)
console.log('監(jiān)聽(tīng) ' + port + ' 成功!請(qǐng)輸入下列地址訪(fǎng)問(wèn)\nhttp://localhost:' + port)
三、主要思路
register.html
使用jQuery的ajax將數(shù)據(jù)發(fā)送請(qǐng)求 /register 給后端,成功則跳轉(zhuǎn)到 sign_in.html
數(shù)據(jù)需要使用 JSON.stringify 轉(zhuǎn)化為字符串在提交
/register
讀取 users.json 的數(shù)據(jù),創(chuàng)建一個(gè)空數(shù)組,將傳遞過(guò)來(lái)的參數(shù) push 進(jìn)去。將數(shù)組轉(zhuǎn)換為字符串,在轉(zhuǎn)換為對(duì)象。
獲取數(shù)據(jù)庫(kù)中最小的 id 值,將數(shù)據(jù)組成新的對(duì)象,添加進(jìn)入 數(shù)據(jù)庫(kù) 中。
sign_in.html
使用ajax將數(shù)據(jù)發(fā)送請(qǐng)求 /sign_in 給后端,成功則跳轉(zhuǎn) home.html
/sign_in
讀取 users.json 的數(shù)據(jù),創(chuàng)建一個(gè)空數(shù)組,將傳遞過(guò)來(lái)的參數(shù) push 進(jìn)去。將數(shù)組轉(zhuǎn)換為字符串,在轉(zhuǎn)換為對(duì)象。
在讀取后的數(shù)據(jù)庫(kù)中,查找有沒(méi)有符合條件的 user,成功返回讀取后的對(duì)象,失敗返回 undefined。
如果成功,設(shè)置隨機(jī)數(shù),將 隨機(jī)數(shù)的值 與 user的id 綁定。并添加到 session.json 中。然后 setHeader,將cookie發(fā)送到瀏覽器。
/home
獲取登入成功后 cookie 的值。讀取 session 中對(duì)應(yīng)的隨機(jī)數(shù)。如果隨機(jī)數(shù)和session對(duì)應(yīng)的隨機(jī)數(shù)值存在,就顯示已登錄,否則顯示未登錄
總結(jié)
到此這篇關(guān)于如何利用Node.js與JSON搭建簡(jiǎn)單的動(dòng)態(tài)服務(wù)器的文章就介紹到這了,更多相關(guān)Node.js與JSON搭建動(dòng)態(tài)服務(wù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- nodejs讀寫(xiě)json文件的簡(jiǎn)單方法(必看)
- nodejs npm package.json中文文檔
- Node.js實(shí)現(xiàn)Excel轉(zhuǎn)JSON
- Node.js返回JSONP詳解
- node.js+Ajax實(shí)現(xiàn)獲取HTTP服務(wù)器返回?cái)?shù)據(jù)
- Node.js實(shí)戰(zhàn) 建立簡(jiǎn)單的Web服務(wù)器
- 輕松創(chuàng)建nodejs服務(wù)器(1):一個(gè)簡(jiǎn)單nodejs服務(wù)器例子
- 用Nodejs搭建服務(wù)器訪(fǎng)問(wèn)html、css、JS等靜態(tài)資源文件
- 詳解Node項(xiàng)目部署到云服務(wù)器上
- 拋棄Nginx使用nodejs做反向代理服務(wù)器
相關(guān)文章
NodeJS 創(chuàng)建目錄和文件的方法實(shí)例分析
這篇文章主要介紹了NodeJS 創(chuàng)建目錄和文件的方法,涉及node.js中fs模塊mkdir、writeFile及目錄判斷existsSync等方法的功能與相關(guān)使用技巧,需要的朋友可以參考下2023-04-04
nodejs 使用http進(jìn)行post或get請(qǐng)求的實(shí)例(攜帶cookie)
今天小編就為大家分享一篇nodejs 使用http進(jìn)行post或get請(qǐng)求的實(shí)例(攜帶cookie),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
module.exports和exports使用誤區(qū)案例分析
module.exports和exports使用誤區(qū),使用require()模塊時(shí),得到的永遠(yuǎn)都是module.exports指向的對(duì)象2023-04-04
node koa2實(shí)現(xiàn)上傳圖片并且同步上傳到七牛云存儲(chǔ)
這篇文章主要介紹了node koa2實(shí)現(xiàn)上傳圖片并且同步上傳到七牛云存儲(chǔ),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
nodeJs編寫(xiě)錯(cuò)誤處理中間件問(wèn)題
這篇文章主要介紹了nodeJs編寫(xiě)錯(cuò)誤處理中間件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
node.js實(shí)現(xiàn)學(xué)生檔案管理
這篇文章主要為大家詳細(xì)介紹了node.js實(shí)現(xiàn)學(xué)生檔案管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
解決npm?run?serve啟動(dòng)報(bào)錯(cuò)npm?ERR?Missing?script:"serve&q
這篇文章主要給大家介紹了關(guān)于解決npm?run?serve啟動(dòng)報(bào)錯(cuò)npm?ERR?Missing?script:"serve"的相關(guān)資料,這是最近開(kāi)發(fā)中遇到的一個(gè)問(wèn)題,文中通過(guò)圖文將解決辦法介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
我的Node.js學(xué)習(xí)之路(四)--單元測(cè)試
在專(zhuān)業(yè)化的軟件開(kāi)發(fā)過(guò)程中,無(wú)論什么平臺(tái)語(yǔ)言,現(xiàn)在都需要UnitTest單元測(cè)試. Node.js有built-in的Assert。 今天讓我們來(lái)看一下Node.js的單元測(cè)試。在這兒我們使用nodeunit2014-07-07
export?default?和?export?的使用方式示例詳解
這篇文章主要介紹了export?default?和?export?的使用方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08

