解压缩并处理 Node.js 中的文件

Unzip and process files in Node.js

我在这里找不到我做错了什么。我正在尝试解压缩文件,然后通过它们在每个文件夹中创建一个新的 HTML 并重命名图像文件。

我测试了它,脚本正在等待解压缩文件,然后再通过它们,但我总是收到以下错误:

(node:3656) UnhandledPromiseRejectionWarning: Error: ENOENT: no such file or directory, scandir 'D:\Sites\rename-files\files\cloud'
[0]     at Object.readdirSync (fs.js:955:3)
[0]     at processDirectories (D:\Sites\rename-files\src\controllers\goDirs.js:8:12)
[0]     at goDirs (D:\Sites\rename-files\src\controllers\goDirs.js:31:5)
[0]     at createBanners (D:\Sites\rename-files\src\controllers\RenameController.js:18:33)
[0]     at processTicksAndRejections (internal/process/task_queues.js:97:5)

这是我的文件:

RenameController.js

const unzipFiles = require('./unzipFiles')
const goDirs = require('./goDirs')

const RenameController = {

    async root(req, res) {
        res.send('hello root!');
    },

    async createBanners(req, res) {
        const { name, link, template } = req.body
        const { filename } = req.file
        const projectName = name.replace(' ','-')        

        try{
            const unzipPath = await unzipFiles(projectName, filename)
        
            const files = await goDirs(
                                    unzipPath,
                                    projectName, 
                                    template, 
                                    link
                                )

            return res.json(JSON.stringify(files))

        } catch(err){
            return res.json(err)
        }
    }
}
module.exports = RenameController

unzipFiles.js

const fs = require('fs')
const path = require('path')
const unzipper = require('unzipper')

const unzipFiles = (projectName, filename) => {
    const zipFile = path.join(__dirname, `../../files/${filename}`)
    const unzipPath = path.join(__dirname, `../../files/${projectName}`)
   
    return new Promise( (resolve, reject) => {
        fs.createReadStream(zipFile)
            .pipe(unzipper.Extract({ path: unzipPath }))
            .on('close', resolve(unzipPath))
    })
}

module.exports = unzipFiles

goDirs.js

const fs = require('fs')
const path = require('path')
const createHtml = require('./createHtml')
let bannerFiles = []

const goDirs = (directory, projectName, template, link) => {
    const processDirectories = async (directory, projectName, template, link) => {
        fs.readdirSync(directory).forEach(function(file){
            const absolute = path.join(directory, file)
            let filename = ''

            if(fs.lstatSync(absolute).isDirectory()){
                createHtml(file, projectName, template, link)
                return processDirectories(absolute, projectName, template, link)
            } else {
                if (file.indexOf('background') >= 0) filename = 'background.jpg'
                else if (file.indexOf('copy') >= 0) filename = 'copy.png'
                else if (file.indexOf('cta') >= 0) filename = 'cta.png'
                else if (file.indexOf('logo') >= 0) filename = 'logo.png'

                fs.rename(
                    absolute,
                    absolute.replace(file, filename),
                    () => {}
                )                    
                bannerFiles.push(absolute)
            }
        })
    }

    processDirectories(directory, projectName, template, link)

    return new Promise((resolve, reject) => {
        bannerFiles.length != 0 ? resolve(bannerFiles) : reject()
    })
}

module.exports = goDirs

谢谢!!

您确定在尝试读取此目录之前路径 D:\Sites\rename-files\files\cloud 存在吗?如果没有,您应该首先手动创建它或使用 fs.mkdir

P.S。如果您使用的是最新版本的节点,则可以使用 'fs/promise' 包而不是 promisifying fs 方法或使用同步方法。 https://nodejs.org/api/fs.html

显然,您需要在 goDirs.js.

中处理拒绝 processDirectories Promise 的情况
    processDirectories(directory, projectName, template, link)

尝试 .catch(...) 这 ☝️ 调用您的异步方法。像这样:

    processDirectories(directory, projectName, template, link).catch(/* your error treatment code */)