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