如何解决在 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)
这是我的文件:
重命名Controller.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,link) => {
const processDirectories = async (directory,link) => {
fs.readdirSync(directory).forEach(function(file){
const absolute = path.join(directory,file)
let filename = ''
if(fs.lstatSync(absolute).isDirectory()){
createHtml(file,link)
return processDirectories(absolute,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,link)
return new Promise((resolve,reject) => {
bannerFiles.length != 0 ? resolve(bannerFiles) : reject()
})
}
module.exports = goDirs
谢谢!!
解决方法
在您尝试读取此目录之前,您确定路径 D:\Sites\rename-files\files\cloud 存在吗?如果没有,您应该先手动创建或使用 fs.mkdir
附言如果您使用的是最新版本的节点,则可以使用 'fs/promise' 包而不是 promisifying fs 方法或使用 Sync 方法。 https://nodejs.org/api/fs.html
,显然,您需要处理 processDirectories
中的 goDirs.js
Promise 被拒绝的情况。
processDirectories(directory,projectName,template,link)
尝试 .catch(...)
这个 ☝️ 调用您的异步方法。像这样:
processDirectories(directory,link).catch(/* your error treatment code */)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。