天天看點

node 使用koa2 異步讀檔案

目的:在一個檔案夾(image)中有很多檔案夾和檔案,排除掉檔案,将所有檔案夾找出來

知識點:

async 函數與 await  。隻有在async函數内部,才能使用await,await等的必須是promse對象,當promise對象resolve()時,await語句執行完畢。

koa2 app.use() 中,ctx.body不能放在異步環境中。 

const http = require('http')
const fs = require('fs')
const koa = require('koa')
const app = new koa()

app.use(async function (ctx, next) {
    ctx.res.setHeader("Access-Control-Allow-Origin", "http://localhost:8080")
    await next() // 執行下一個app.use,當下一個app.use執行完過後,在接着執行下面的語句
   console.log('4')
})
app.use(async function (ctx, next) {
    let files = []
    let newfiles = []
    await new Promise((resolve, reject) => { // 讀image檔案夾
        fs.readdir (__dirname + '/static/image', function(err, picFiles) {
            if(err) ctx.throw(err)
            files = picFiles // 将所有的檔案夾名字放到外面來。
            console.log('1') 
            resolve()  // resolve過後,await語句才結束
        })
    })
    const stats = function (fileName) {
        return new Promise((resolve, reject) => {
            fs.stat(__dirname + '/static/image/' + fileName, function (err, file) { // 檢視是否是檔案夾
                if(file.isDirectory()) newfiles.push(fileName)
                console.log('2')
                resolve()
            })
        })
    }
    let promises = files.map(file => stats(file)) // *這兒使用map() 它傳回的值組成新的數組promises,每個元素都是stats()函數傳回的promise對象。
    await Promise.all(promises) // 當所有promise都resolve()後 執行下一步
    console.log(3)
    ctx.body = newfiles // 這個必須放在外面,不能放在promise.all().then()中
})

app.listen('80', '127.0.0.1')
      

  

上一篇: MVC架構

繼續閱讀