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

