首页 > 解决方案 > 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 });

我确信问题是由错误的语法引起的。我希望有一个人可以帮助我。

标签: node.jsasynchronouspromisefsmulter

解决方案


您的代码中有一些错误。

首先,当您调用您的数据库时,我认为最好以串行方式向您的数据库发送请求。这意味着它将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);
  }
});

推荐阅读