Express中promisify將非同步api轉換成promise的形式
阿新 • • 發佈:2021-11-24
原始碼
app.get('/todo', (req, res) => { fs.readFile('./db.json', 'utf8', (err, data) => { if(err) { res.status(500).end() } else { res.status(200).json(JSON.parse(data)) } }) }) app.get('/todo/:id', (req, res) => { fs.readFile('./db.json', 'utf8', (err, data) => { if(err) { res.status(500).end() } else { let db = JSON.parse(data) let todo = db.todos.find(item => item.id === Number.parseInt(req.params.id)) if(!todo) { return res.status(404).end() } res.status(200).json(todo) } }) })
promisify形式程式碼
以上程式碼其實可以將讀取檔案部分的程式碼封裝,但是該程式碼為非同步回撥函式,可以將這種callback
形式的非同步回撥api
通過promisify
轉換成promise
形式,便於封裝
封裝的函式
const fs = require('fs') const path = require('path') // 將callback這種形式的非同步api轉換成promise的方式 const { promisify } = require('util') const readFile = promisify(fs.readFile) const dbPath = path.join(__dirname, './db.json') exports.getDb = async () => { const data = await readFile(dbPath, 'utf8') return JSON.parse(data) }
呼叫該函式
const { getDb } = require('./db'); app.get('/todo', async (req, res) => { try { const db = await getDb() res.status(200).json(db.todos) } catch(err) { res.status(500).json({ error: err.message }) } }) app.get('/todo/:id', async (req, res) => { try { const db = await getDb() let todo = db.todos.find(item => item.id === Number.parseInt(req.params.id)) if(!todo) { return res.status(404).end() } res.status(200).json(todo) } catch(err) { res.status(500).json({ error: err.message }) } })