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 库的语法错误的主要内容,如果未能解决你的问题,请参考以下文章

带有泛型的 Typescript 箭头函数的语法错误

上传文件时 Multer 出现意外的字段错误

使用带有 expressjs 的 multer 上传文件时的错误处理

不能 app.use(multer)。 “需要中间件功能”错误

当我尝试在 MongoDB 数据库中上传图像时,出现 multer 错误

无法让 multer filefilter 错误处理工作