時間:2023-05-25 04:09:02 | 來源:網(wǎng)站運營
時間:2023-05-25 04:09:02 來源:網(wǎng)站運營
Node.js——express開發(fā)web服務(wù)器:npm install -g express-generator
創(chuàng)建項目:express express-demo
項目目錄如下:├── app.js├── bin│ └── www├── package-lock.json├── package.json├── public│ ├── images│ ├── javascripts│ └── stylesheets│ └── style.css├── routes│ ├── index.js│ └── users.js└── views ├── error.jade ├── index.jade └── layout.jade
我們可以安裝依賴,將程序跑起來:npm installnode bin/www
方式二:從零學(xué)習(xí)搭建npm init -y
express的安裝:release
版本是4.17.1,我們使用該版本;npm install express
const express = require('express');// 創(chuàng)建服務(wù)器const app = express();// /home的get請求處理app.get("/home", (req, res) => { res.end("Hello Home");});// /login的post請求處理app.post("/login", (req, res) => { res.end("Hello Login");});// 開啟監(jiān)聽app.listen(8000, () => { console.log("服務(wù)器啟動成功~");})
我們會發(fā)現(xiàn),之后的開發(fā)過程中,可以方便的將請求進行分離:/users/:userId
;request
對象中要獲取可以通過 req.params.userId
;res.json(數(shù)據(jù))
方式;const express = require('express');const app = express();app.get('/users/:userId', (req, res, next) => { console.log(req.params.userId); res.json({username: "coderwhy", level: 99});});app.listen(8000, () => { console.log("靜態(tài)服務(wù)器啟動成功~");})
請求-響應(yīng)周期
(返回數(shù)據(jù));請求-響應(yīng)周期
,則必須調(diào)用next()將控制權(quán)傳遞給下一個中間件功能,否則,請求將被掛起。app/router.use
和app/router.methods
;app.get或app.post
等;const express = require('express');const app = express();app.use((req, res, next) => { console.log("common middleware 01"); next();})app.use((req, res, next) => { console.log("common middleware 02"); res.end("Hello Common Middleware~");})app.listen(8000, () => { console.log("中間件服務(wù)器啟動成功~");})
中間件的執(zhí)行順序:// 案例二: 路徑匹配中間件app.use('/home', (req, res, next) => { console.log("home middleware 01"); next();});app.use('/home', (req, res, next) => { console.log("home middleware 02"); next(); res.end("Hello Home middleware");});app.use((req, res, next) => { console.log("common middleware");});
案例三:path和method匹配中間件// 案例三: method匹配中間件app.get('/home', (req, res, next) => { console.log("home get middleware"); next();})app.post('/login', (req, res, next) => { console.log("login post middleware"); next();});app.use((req, res, next) => { console.log("common middleware");});
案例四:注冊多個中間件// 案例四: 注冊多個中間件const homeMiddleware1 = (req, res, next) => { console.log('home middleware 01'); next();}const homeMiddleware2 = (req, res, next) => { console.log('home middleware 02'); next();}const homeHandle = (req, res, next) => { res.end("Hello Home~");}app.get('/home', homeMiddleware1, homeMiddleware2, homeHandle);
app.post('/login', (req, res, next) => { req.on('data', (data) => { console.log(data.toString()); }) req.on('end', () => { res.end("登錄成功~"); });});
我們也可以自己編寫中間件來解析JSON:app.use((req, res, next) => { if (req.headers['content-type'] === 'application/json') { req.on('data', (data) => { const userInfo = JSON.parse(data.toString()); req.body = userInfo; }) req.on('end', () => { next(); }) } else { next(); }})app.post('/login', (req, res, next) => { console.log(req.body); res.end("登錄成功~");});
但是,事實上我們可以使用expres內(nèi)置的中間件或者使用body-parser
來完成:app.use(express.json());app.post('/login', (req, res, next) => { console.log(req.body); res.end("登錄成功~");});
如果我們解析的是 application/x-www-form-urlencoded
:urlencoded
函數(shù)來作為中間件:app.use(express.json());app.use(express.urlencoded({extended: true}));app.post('/login', (req, res, next) => { console.log(req.body); res.end("登錄成功~");});
npm install morgan
直接作為中間件使用即可:const loggerWriter = fs.createWriteStream('./log/access.log', { flags: 'a+'})app.use(morgan('combined', {stream: loggerWriter}));
npm install multer
上傳文件,并且默認文件名:const upload = multer({ dest: "uploads/"})app.post('/upload', upload.single('file'), (req, res, next) => { console.log(req.file.buffer); res.end("文件上傳成功~");})
添加文件名后綴:const storage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, "uploads/") }, filename: (req, file, cb) => { cb(null, Date.now() + path.extname(file.originalname)); }})const upload = multer({ storage})app.post('/upload', upload.single('file'), (req, res, next) => { console.log(req.file.buffer); res.end("文件上傳成功~");})
我們也可以上傳多張圖片:app.use('/upload', upload.array('files'), (req, res, next) => { console.log(req.files);});
如果我們希望借助于multer幫助我們解析一些form-data中的普通數(shù)據(jù),那么我們可以使用any:app.use(upload.any());app.use('/login', (req, res, next) => { console.log(req.body);});
app.use('/login/:id/:name', (req, res, next) => { console.log(req.params); res.json("請求成功~");})
方式二:queryapp.use('/login', (req, res, next) => { console.log(req.query); res.json("請求成功~");})
response.end
方法,用法是一致的res.end("Hello World");
json方法res.json({name: "why", age: 18});
status方法res.status(204);
express.Router
來創(chuàng)建一個路由處理程序:迷你應(yīng)用程序
(mini-app);// 用戶相關(guān)的處理const userRouter = express.Router();userRouter.get('/', (req, res, next) => { res.end("用戶列表");});userRouter.post('/', (req, res, next) => { res.end("創(chuàng)建用戶");});userRouter.delete('/', (req, res, next) => { res.end("刪除用戶");});app.use('/users', userRouter);
當(dāng)然,我們可以配置更多的路由,并且將所有的邏輯放到一個單獨的文件中。const express = require('express');const app = express();app.use(express.static('./build'));app.listen(8000, () => { console.log("靜態(tài)服務(wù)器啟動成功~");})
app.use((req, res, next) => { next(new Error("USER DOES NOT EXISTS"));});app.use((err, req, res, next) => { const message = err.message; switch (message) { case "USER DOES NOT EXISTS": res.status(400).json({message}) } res.status(500)})
express
函數(shù)的本質(zhì)其實是createApplication
:關(guān)鍵詞:服務(wù)
微信公眾號
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。