Whatsapp Cloud API 上传媒体文件错误

Yu *_* Ng 4 javascript form-data node.js whatsapp axios

目前我正在尝试围绕 Whatsapp Cloud API 制作一个薄包装器。我目前面临的问题之一是上传媒体文件无法正常工作。

查看上传文件的文档,似乎它需要将multipart/form-data有效负载发送到端点。

这是我当前的实现

import FormData from 'form-data';
import fs from 'fs';
import axios from 'axios';

const formData = new FormData();

formData.append('file', fs.createReadStream('path/to/my/file.jpg'));
formData.append('messaging_product', 'whatsapp');
formData.append('type', 'image/jpeg');

await axios.post('https://graph.facebook.com/v14.0/PHONE_NO_ID/media', formData, {
  headers: { 'Authorization': ACCESS_TOKEN }
});
Run Code Online (Sandbox Code Playgroud)

看看它返回的错误,似乎我在某种程度上丢失了该messaging_product字段,即使我已将其正确添加到 formData 中。

{
  "error": {
    "message": "(#100) The parameter messaging_product is required.",
    "type": "OAuthException",
    "code": 100,
    "fbtrace_id": "FBTRACE_ID"
  }
}
Run Code Online (Sandbox Code Playgroud)

Postman集合用于上传媒体文件,所以我认为fileformData 的字段是问题所在。是fs.createReadStream在文件上相当于Postman处理文件上传的方式

编辑:问题已经解决,问题不是添加到 formData 生成的标题中,感谢下面的菲尔!

Phi*_*hil 5

喜欢这个文档...他们说type这是一个必需的参数,然后继续展示一个curl没有它的示例。

还有,file不是...

存储在本地目录中的文件的路径

而是一个 mime 编码的二进制文件。

在任何情况下,都type需要通过content-type元数据成为 mime 编码的一部分,然后您需要转发由 生成的内容类型标头FormData

您还可能缺少Bearer身份验证令牌方案。

const PHONE_NO_ID = "something";
const ACCESS_TOKEN = "something";

const formData = new FormData();

formData.append("file", fs.createReadStream("path/to/my/file.jpg"), {
  contentType: "image/jpeg",
});
formData.append("messaging_product", "whatsapp");

try {
  const {
    data: { id: mediaId },
  } = await axios.post(
    `https://graph.facebook.com/v14.0/${PHONE_NO_ID}/media`,
    formData,
    {
      headers: {
        Authorization: `Bearer ${ACCESS_TOKEN}`, // "Bearer" prefix
        ...formData.getHeaders(), // merge in FormData headers
      },
    }
  );
  console.log("media ID", mediaId);
} catch (err) {
  console.error("upload", err.toJSON());
}
Run Code Online (Sandbox Code Playgroud)