【问题标题】:Wrong syntax with Multer LibraryMulter 库的语法错误
【发布时间】: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。

标签: node.js asynchronous promise fs multer


【解决方案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。我认为没有必要给我钥匙。
猜你喜欢
  • 2021-02-25
  • 2016-02-02
  • 2010-11-12
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 2021-11-28
相关资源
最近更新 更多