Multer 库的语法错误
Posted
技术标签:
【中文标题】Multer 库的语法错误【英文标题】:Wrong syntax with Multer Library 【发布时间】:2021-10-10 23:41:09 【问题描述】:我正在创建一个管理员面板,管理员可以在其中上传最多 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 设置:**
// 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 );
我确定问题是由错误的语法引起的。我希望有人可以帮助我。
【问题讨论】:
请用 repo 更新您的问题并告诉我们您需要帮助的部分,而不是仅仅分享您的 repo。 【参考方案1】:您的代码中有一些错误。
首先,当您调用数据库时,我认为最好以串行方式向您的数据库发送请求。这意味着它将一一完成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);
);
【讨论】:
还有 Promise.all 的部分 ???理论上,当您使用 'new Promise((resolve, reject)) 时,您应该使用 .then .catch? @antoniosalzano,您可能对 Promise 和异步函数不太了解。你可以看看this doc。它们实际上是相同的,async/await 只是 Promise 之上的语法糖。你真的不需要Promise.all
,但你也可以使用它,它会一次将所有请求发送到数据库,这可能不是一个好习惯。
不幸的是,问题仍然存在。我可以给你我的 GitHub 存储库吗?我也可以给你我的tinify key API,没有问题。因为这是给客户的……
@antoniosalzano,您可以在问题中分享 repo。我认为没有必要给我钥匙。以上是关于Multer 库的语法错误的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 expressjs 的 multer 上传文件时的错误处理
不能 app.use(multer)。 “需要中间件功能”错误