node.js - Multer 库的语法错误
问题描述
我正在创建一个管理面板,管理员可以在其中上传最多5 张图像(通过 multer),并且路径存储在集群(猫鼬)中。有两个文件夹:Products 和 OptimizedImages。最初,我将它们上传到 Products 文件夹,然后通过 Tinify(用于压缩图像的库)将它们放在 OptimizedImages 上并删除它们(使用 rimraf,因为 fs.unlink 不起作用)。
const results = req.files.map(async file => {
return new Promise(async (resolve, reject) => {
await Product.findByIdAndUpdate(product._id, {
$push: {
paths: {
path: file.filename
}
}
});
const src = tinify.fromFile(`./public/Products/${file.filename}`);
src.toFile(`./public/OptimizedImages/${file.filename}`)
.then(() => {
rimraf(`./public/Products/${file.filename}`, err => {
if (err) {
return reject(err)
}
return resolve(file)
})
}).catch(err => {
throw new Error(err);
})
})
})
Promise.all(results)
.then(resp => {
console.log(resp);
return res.redirect('/admin/dashboard');
}).catch(err => {
throw new Error(err);
})
但是当我上传 5 张图片时,OptimizedImages 文件夹中会出现 4 张图片,有时是 5 张图片。有时 2 或 3 张图片位于 Products 文件夹中,1 张图片被压缩......也许是因为语法的同步错误?我还尝试了 rimraf.sync() 等。
**混合器设置:**
// Multer Setup
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'public/Products/')
},
filename: (req, file, cb) => {
cb(null, Date.now() + path.extname(file.originalname));
}
})
// I tried both but nothing =>
// const upload = multer({ storage, limits: { fieldSize: 10 * 1024 * 1024 } });
const upload = multer({ storage });
我确信问题是由错误的语法引起的。我希望有一个人可以帮助我。
解决方案
您的代码中有一些错误。
首先,当您调用您的数据库时,我认为最好以串行方式向您的数据库发送请求。这意味着它将findByIdAndUpdate
一个一个完成,而不是一次发送所有请求。
其次,您没有rimraf
正确地将函数包装在 Promise 中。
下面的例子
(async function run(req, res) {
try {
const results = [];
for (const file of req.files) {
const data = await Product.findByIdAndUpdate(product._id, {
$push: {
paths: {
path: file.filename,
},
},
});
results.push(data);
const src = tinify.fromFile(`./public/Products/${file.filename}`);
await src.toFile(`./public/OptimizedImages/${file.filename}`);
await new Promise((resolve, reject) => {
rimraf(`./public/Products/${file.filename}`, err => {
if (err) {
reject(err);
}
resolve();
});
});
}
console.log(results);
res.redirect("/admin/dashboard");
} catch (err) {
console.log(err);
}
});
推荐阅读
- vb.net - HTML Agility Pack 导致代码在加载调用后停止执行
- excel - VBA 公式应用程序/对象定义错误
- python - 有没有办法将属性添加到函数作为函数定义的一部分?
- docker - 如何让 SonarQube(在 docker 容器中运行)从 Jenkins Pipeline 连接到 localhost:9000?
- typescript - TS 将单独的类型文件导入单个 index.d.ts 文件
- c# - INotifyPropertyChanged 已实现但无法正常工作
- c++ - 值传递、异常/断言和类设计。批评/问题
- count - db2 UDB count(*) 从视图返回 0,但 select * 返回有效数据
- jquery - 使用 jquery 对嵌套列表进行排序
- php - 如何在 Laravel 中使用 Git?