基于nodejs使用express創(chuàng)建web服務(wù)器的操作步驟
一、創(chuàng)建web服務(wù)器
1、初始化項(xiàng)目并安裝express包
初始化項(xiàng)目
npm init -y
安裝express
npm i express
2、創(chuàng)建服務(wù)器
1、創(chuàng)建一個(gè)index.js文件 2、導(dǎo)入express 3、創(chuàng)建服務(wù)器 4、調(diào)用listen啟動(dòng)服務(wù)器(listen傳入兩個(gè)參數(shù):端口號(hào),回調(diào)函數(shù)) 5、在當(dāng)前目錄下使用node index.js啟動(dòng)該程序,控制臺(tái)打印出:Server is running on port 3000,則表示服務(wù)器在3000端口啟動(dòng)成功
// 導(dǎo)入express
const express = require('express')
// 創(chuàng)建服務(wù)器
const app = express()
// 調(diào)用listen啟動(dòng)服務(wù)器
app.listen(3000, () => {
console.log('Server is running on port 3000')
})node index.js
3、監(jiān)聽get,post請(qǐng)求
監(jiān)聽get,post請(qǐng)求(req:請(qǐng)求參數(shù),res:響應(yīng)參數(shù)),使用res.send(data)向web段響應(yīng)數(shù)據(jù)
// 監(jiān)聽GET請(qǐng)求
app.get('/', (req, res) => {
res.send('Hello, GET request received!')
})
// 監(jiān)聽POST請(qǐng)求
app.post('/', (req, res) => {
res.send('Hello, POST request received!')
})4、獲取請(qǐng)求參數(shù)
web端向服務(wù)器傳遞參數(shù),可以通過params,query,body傳遞參數(shù),其中一般get請(qǐng)求使用params,query傳遞參數(shù),post請(qǐng)求使用body傳遞參數(shù) 1、get請(qǐng)求使用params獲取參數(shù),請(qǐng)求url:http://127.0.0.1:3000/test/123,此時(shí)web獲取響應(yīng)id:123
// 獲取params參數(shù)
app.get('/test/:id', (req, res) => {
const id = req.params.id
res.send(`id: ${id}`)
})3、post請(qǐng)求使用body獲取參數(shù),請(qǐng)求url:http://127.0.0.1:3000/test。對(duì)于post請(qǐng)求,我們首先使用app.use中間件來解析請(qǐng)求的表單數(shù)據(jù)。通過express.urlencoded中間件來解析x-www-form-urlencoded格式的表單數(shù)據(jù),其中extended: false表示不使用第三方庫來處理嵌套的對(duì)象。如果你需要處理其他類型的數(shù)據(jù)(例如JSON數(shù)據(jù)),你可以使用express.json中間件。(中間件概念后續(xù)會(huì)有詳細(xì)介紹) 請(qǐng)求數(shù)據(jù):{id: 123, name: whg},響應(yīng)數(shù)據(jù):testData: {id: 123, name: whg}
app.use(express.urlencoded({ extended: false }))
app.use(express.json())
// 獲取body參數(shù)
app.post('/test', (req, res) => {
const testData = req.body
res.send(`testData: ${testData}`)
})二、express路由
在Express中,路由(Routing)是指將不同的HTTP請(qǐng)求映射到相應(yīng)的處理程序或控制器的過程。Express提供了一種簡單而靈活的方式來定義和管理路由,使開發(fā)人員能夠處理不同的URL路徑和HTTP方法。
1、直接使用路由
監(jiān)聽get,post請(qǐng)求中的/test路由,當(dāng)請(qǐng)求url為http://127.0.0.1:3000/test時(shí),進(jìn)入對(duì)應(yīng)的請(qǐng)求處理函數(shù)中
// 監(jiān)聽GET請(qǐng)求/test路由
app.get('/test', (req, res) => {
res.send('Hello, GET request received!')
})
// 監(jiān)聽POST請(qǐng)求/test路由
app.post('/test', (req, res) => {
res.send('Hello, POST request received!')
})2、使用路由器
路由器是一個(gè)中間件,用于將具有共同路徑前綴的相關(guān)路由組合在一起。它可以看作是一個(gè)獨(dú)立的模塊,負(fù)責(zé)處理特定的URL路徑。使用路由器可以將應(yīng)用程序的路由邏輯組織成模塊化的方式,提高代碼的可維護(hù)性和可讀性 創(chuàng)建用戶登陸注冊(cè)路由器模塊:users.js
// 導(dǎo)入express
const express = require('express')
// 創(chuàng)建路由器
const router = express.Router()
// 使用路由器監(jiān)聽路由
router.post('/login', (req, res) => {
res.send('login success')
})
router.post('/register', (req, res) => {
res.send('register success')
})
// 導(dǎo)出路由器
modules.exports = router創(chuàng)建用戶信息相關(guān)路由器模塊:userInfo.js
// 導(dǎo)入express
const express = require('express')
// 創(chuàng)建路由器
const router = express.Router()
// 使用路由器監(jiān)聽路由
router.post('/setUserInfo', (req, res) => {
res.send('setUserInfo success')
})
router.post('/getUserInfo', (req, res) => {
res.send('getUserInfo success')
})
// 導(dǎo)出路由器
modules.exports = router在index.js中導(dǎo)入并注冊(cè)該路由器 app.use注冊(cè)路由時(shí)可傳入兩個(gè)參數(shù),第一個(gè)參數(shù)為統(tǒng)一前綴(可選,不傳則默認(rèn)沒有前綴),第二個(gè)參數(shù)為路由器。當(dāng)url為http://127.0.0.1:3000/login時(shí)進(jìn)入登錄路由處理函數(shù)中,當(dāng)url為http://127.0.0.1:3000/api/setUserInfo時(shí),進(jìn)入設(shè)置用戶信息路由處理函數(shù)中
// 導(dǎo)入路由器
const userRouter = require('./users')
const userInfoRouter = require('./userInfo')
// 注冊(cè)路由
app.use(userRouter)
app.use('/api', userInfoRouter)3、封裝路由處理函數(shù)
將路由相關(guān)邏輯進(jìn)一步模塊化(以u(píng)ser.js為例) 創(chuàng)建routerHandler文件夾,存放users.js文件(注意,和router文件夾下的文件名相同,可清晰看出路由器文件和處理函數(shù)文件的一一對(duì)應(yīng)關(guān)系)
// 登錄路由處理函數(shù)
exports.login = (req, res) => {
res.send('login success')
}
// 注冊(cè)路由處理函數(shù)
exports.register = (req, res) => {
res.send('register success')
}創(chuàng)建router文件夾,存放users.js文件
// 導(dǎo)入express
const express = require('express')
// 創(chuàng)建路由器
const router = express.Router()
// 導(dǎo)入路由處理函數(shù)
const { login, register } = require('../routerHandler/user.js')
// 使用路由器監(jiān)聽路由
router.post('/login', login)
router.post('/register', register)
// 導(dǎo)出路由器
modules.exports = router三、express中間件
Express中間件(Middleware)是在請(qǐng)求和響應(yīng)之間處理HTTP請(qǐng)求的功能組件。中間件函數(shù)可以訪問請(qǐng)求對(duì)象(req)、響應(yīng)對(duì)象(res)和應(yīng)用程序的下一個(gè)中間件函數(shù)(next)。中間件函數(shù)可以用于執(zhí)行各種任務(wù),例如身份驗(yàn)證、日志記錄、錯(cuò)誤處理等。使用中間件可以將應(yīng)用程序的處理邏輯分解為可重用和可組合的部分,提高代碼的可維護(hù)性和可擴(kuò)展性。中間件大致分為以下5種,下面我們使用模塊化的思想將所有自定義的中間件放在common文件夾的middleware.js文件中
1、應(yīng)用級(jí)中間件(Application-level Middleware)
應(yīng)用級(jí)中間件又稱為全局中間件,這些中間件綁定到應(yīng)用程序?qū)ο螅╝pp)上,并在所有路由之前執(zhí)行。它們可以用于處理應(yīng)用程序級(jí)別的任務(wù),如日志記錄、身份驗(yàn)證、錯(cuò)誤處理等。使用app.use()方法將應(yīng)用級(jí)中間件添加到應(yīng)用程序中。 中間件函數(shù)中一定要調(diào)用next()方法,否則會(huì)報(bào)錯(cuò)
// 定義一個(gè)應(yīng)用級(jí)中間件,該中間件封裝了res.send()方法
exports.resSendMiddleware = (req, res, next) => {
res.commonResSend = (status, message, data) => {
res.send({
status,
message,
data: data ? data : null
})
}
next()
}注意:全局中間件一般要放在路由中間件之前
// 導(dǎo)入中間件
const { resSendMiddleware } = require('../common/middleware.js')
// 注冊(cè)全局中間件
app.use(resSendMiddleware)
// 注冊(cè)路由中間件
// TODO2、路由級(jí)中間件(Router-level Middleware)
路由級(jí)中間件又稱為局部中間件這些中間件與特定的路由綁定,并在特定路由處理程序之前執(zhí)行。它們用于在特定路由上執(zhí)行一些操作,如身份驗(yàn)證、請(qǐng)求處理等。使用express.Router()創(chuàng)建路由對(duì)象,然后使用router.use()將路由級(jí)中間件添加到路由對(duì)象中。
// 定義一個(gè)路由級(jí)中間件,該中間件封裝了校驗(yàn)登錄數(shù)據(jù)合法性
exports.verifyLogin = (req, res, next) => {
const userInfo = req.body
// 校驗(yàn)邏輯
// TODO
next()
}// 導(dǎo)入路由處理函數(shù)
const { login, register } = require('../routerHandler/user.js')
// 導(dǎo)入中間件
const { verifyLogin } = require('../common/middleware.js')
// 使用路由器監(jiān)聽路由
router.post('/login', verifyLogin, login)
router.post('/register', register)
// 導(dǎo)出路由器
modules.exports = router3、錯(cuò)誤處理中間件(Error Handling Middleware)
這些中間件用于處理發(fā)生在路由處理程序中的錯(cuò)誤。它們?cè)谄渌虚g件和路由處理程序之后定義,并使用四個(gè)參數(shù)(err, req, res, next)來捕獲錯(cuò)誤并處理它們。使用app.use()將錯(cuò)誤處理中間件添加到應(yīng)用程序中。
// 定義一個(gè)錯(cuò)誤中間件,捕捉錯(cuò)誤
exports.handleError = (err, req, res, next) => {
if (err.name === 'UnauthorizedError') {
// JWT 認(rèn)證失敗
res.commonResSend(401, '身份認(rèn)證失敗')
}
}// 導(dǎo)入中間件
const { resSendMiddleware, handleError } = require('../common/middleware.js')
// 注冊(cè)全局中間件
app.use(resSendMiddleware)
// 注冊(cè)路由
// TODO
// 注冊(cè)錯(cuò)誤中間件
app.use(handleError)4、第三方中間件(Third-party Middleware)
這些中間件是由第三方開發(fā)人員創(chuàng)建的,可以通過NPM安裝并在Express應(yīng)用程序中使用。第三方中間件可以提供各種功能,如身份驗(yàn)證、日志記錄、壓縮等。使用app.use()將第三方中間件添加到應(yīng)用程序中。 例如處理跨域中間件cors,使用npm i cors安裝之后,可直接引用并注冊(cè)
// 導(dǎo)入cors
const cors = require('cors')
// 導(dǎo)入中間件
const { resSendMiddleware, handleError } = require('../common/middleware.js')
// 注冊(cè)解決跨域問題中間件
app.use(cors)
// 注冊(cè)全局中間件
app.use(resSendMiddleware)
// 注冊(cè)路由中間件
// TODO
// 注冊(cè)錯(cuò)誤中間件
app.use(handleError)5、內(nèi)置中間件(Built-in Middleware)
Express提供了一些內(nèi)置的中間件,可直接在應(yīng)用程序中使用,而無需安裝額外的包。例如,express.urlencoded(),express.json()用于解析請(qǐng)求的JSON數(shù)據(jù),express.static()用于提供靜態(tài)文件等。
// 導(dǎo)入cors
const cors = require('cors')
// 導(dǎo)入中間件
const { resSendMiddleware, handleError } = require('../common/middleware.js')
// 注冊(cè)解決跨域問題中間件
app.use(cors)
// 注冊(cè)內(nèi)置中間件
app.use(express.urlencoded({ extended: false }))
app.use(express.json())
app.use(express.static('public'))
// 注冊(cè)全局中間件
app.use(resSendMiddleware)
// 注冊(cè)路由中間件
// TODO
// 注冊(cè)錯(cuò)誤中間件
app.use(handleError)四、代碼熱更新
為了避免我們每次修改代碼后都需要執(zhí)行一次node index.js來重新運(yùn)行代碼,我們可以全局安裝nodemon來監(jiān)視代碼修改并自動(dòng)重新啟動(dòng)應(yīng)用程序
npm install -g nodemon
運(yùn)行代碼
nodemon index.js
以上就是基于nodejs使用express創(chuàng)建web服務(wù)器的操作步驟的詳細(xì)內(nèi)容,更多關(guān)于nodejs express創(chuàng)建web服務(wù)器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Node.js 中正確使用 async/await 與 Promise 
在Node.js中,async/await是ES2017引入的一種更簡潔的處理異步操作的方式,它基于Promise來進(jìn)行編寫,使得異步代碼看起來更像同步代碼,易于理解和維護(hù),這篇文章主要介紹了Node.js 中正確使用 async/await 與 Promise 對(duì)象配合,需要的朋友可以參考下2024-07-07
Node.js調(diào)用java之node-java問題
這篇文章主要介紹了Node.js調(diào)用java之node-java問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10

