如何使用 Nodejs 上传带有 json 的图像

Posted

技术标签:

【中文标题】如何使用 Nodejs 上传带有 json 的图像【英文标题】:How to upload Image with json using Nodejs 【发布时间】:2022-01-13 07:48:45 【问题描述】:

我正在尝试上传带有 json 数据主体的图像。我已经看到如何在邮递员中执行请求,但是在我的终端中,我在控制台记录 req.body 时得到以下信息

[Object: null prototype] '': '"product": "pokemon"' 当记录 req.body.product 时返回未定义

图片上传成功,创建了新产品,但是没有json数据。 当仅发送带有正文而没有图像的请求时,它也可以正常工作。 我怎样才能让它们一起工作?

这是我的代码:

export const addNewProduct = async (req, res, next) => 
  const userId = req.params.userId;
  const user = await User.findById(userId);
  if (!user) 
    return next(createError(404, "User with id"+ $userId +"not found"));
  

  try 
    let result;
    if (req.file !== undefined && req.file.path !== undefined) 
      result = await cloudinary.v2.uploader.upload(req.file.path, 
        folder: `capstone/products/$userId`,
      );
    

    console.log(req.body);

    const newProductData = 
      // product: req.body.product,
      // amount: req.body?.amount || "",
      // untis: req.body?.units || "",
      // price: req.body?.price || "",
      ...req.body,
      businessId: userId,
      image:
        result?.url ||
        req.body?.image ||
        "https://via.placeholder.com/300/09f/fff.png",
      cloudinary_id: result?.public_id || "",
    ;
    const newProduct = new Product(newProductData);
    const createdProduct = await newProduct.save();

    res.status(200).send(createdProduct);
   catch (error) 
    if (error.name === "ValidationError") 
      next(createError(400, error));
     else 
      next(createError(500, error));
    
  
;

我想使用与创建新“产品”相同的端点,并希望在创建时选择上传带有其详细信息的图像。然后将来自 Cloudinary 的 URL 存储在产品中。

json 示例:

"产品": "玩具", “价格”:“1.99”, “金额”:“1”, “状态”:“高” 只有产品是模型中的必需字符串。 *做一个中间件检查,看看它是否是唯一的。

在邮递员中,我确实使用了 auto、application/json、multipart/form-data 等。我还分别在密钥对中添加了“data”或“json”

Postman on auto content tyoe

example of postman with content type added

【问题讨论】:

什么json数据? "product": "toy", "price": "1.99", "amount": "1", "status": "high" json 正文示例。我用有问题的图片更新了它 - 邮递员。 application/json 是一种基于文本的格式。它不能用于发送二进制文件。 multipart/form-data 是文件上传的正确类型,但是由于所有数据都标记为二进制,因此您会在请求处理程序上丢失自动 json 转换。您需要手动提取有效负载的 json 部分和JSON.parse()。如果您使用的是 express,则它是 ***.com/questions/40076807/… 的副本 【参考方案1】:

我已经设法通过以下方式解决了这个问题: POSTMAN solution

在前端,我必须附加所有对象,而不仅仅是发送图像时的图像。因此都在formdata下。和一个没有附加图像文件的 if 语句,将其作为普通 JSON 发送。感谢大家的意见——一路上学到了很多东西。

【讨论】:

以上是关于如何使用 Nodejs 上传带有 json 的图像的主要内容,如果未能解决你的问题,请参考以下文章

在 NodeJS/Express 中将带有其他键值参数的图像上传到 postman

如何在nodejs中使用sharp调整图像大小然后使用multer上传

如何在nodejs中使用sharp调整图像大小然后使用multer上传

我应该如何批量上传到 s3 并通过最终回调从 nodeJS 网络服务器插入到 MongoDB?

如何使用 multer 和 NodeJS 将图像上传到 GCS 存储桶?

如何使用 NodeJS 将文件或图像上传到服务器