You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Expo环境下React Native发送PDF为空及网络错误问题求助

Expo环境下Fetch发送PDF至后端并通过Nodemailer邮件附件发送的问题

注:我使用的是Expo环境

我在模拟器上生成了一份内容正常的PDF,希望将其发送至后端,再通过后端以邮件附件形式发送。


最初的实现方案及问题

前端Fetch请求代码

async sendMonthReportMail(fileUri) {
  await fetch(`${connectionString}/api/mails/sendmonthreport`, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      senderUser: "My Name",
      recieverMail: "myname@mymail.com",
      pathMonthLock: `${fileUri}`
    })
  })
  .then(res => res.json())
  .then(res => {
    console.log("Success SendMailMonthLock - " + res)
  })
  .catch(err => console.log("Error SendMailMonthLock - " + err))
}

我也尝试过使用FormData并将Content-Type改为"application/pdf",但未生效。

后端Nodemailer代码

router.post("/sendmonthreport", async (req, res) => {
  const {recieverMail} = req.body;
  const {senderUser} = req.body;
  const {pathMonthLock} = req.body;

  let transport = nodemailer.createTransport({
    host: "mailserver",
    port: xx,
    secure: false,          
    tls: {    
      rejectUnauthorized: false     
    }
  });

  var message = {
    from: "My Sendermail <sender@mail.com>",
    to: `${recieverMail}`,
    subject: `Mail comming from - ${senderUser}`,
    text: `EmailText `,
    attachments:[{
      filename: "MyFilename.pdf",
      content: __dirname + `./${pathMonthLock}`,
    }] 
  }    

  await transport.sendMail(message)
  .catch(err => console.log("Error Mail: " + err ))

  res.send("email send")
})

PDF的uri是通过Expo的DocumentPicker获取的。

问题1:邮件能正常发送,附件名称正确,但PDF仅500字节且为空,打开提示损坏或格式错误。


尝试使用FormData的失败情况

前端代码

async sendMonthReportMail(file) {
  fdPost.append("file", file);
  fdPost.append("senderUser", "User Name");
  fdPost.append("recieverMail", "username@mail.com");

  console.log(fdPost);

  await fetch(`${connectionString}/api/mails/sendmonthreport`, {
    method: "POST",
    headers: {
      accept: "application/json"
      // "Content-Type": "multipart/form-data",
      // "Content-Type": "application/json",
      // "Content-Type" : "application/pdf"
      // "Content-Type": "application/x-www-form-urlencoded"
    },
    body: fdPost                                
  })
  .then(res => res.json())
  .then(res => {
    console.log("Success SendMailMonthLock - " + res)
  })
  .catch(err => console.log("Error SendMailMonthLock - " + err))
}

fdPost在文件顶部定义,打印显示为有效FormData,但请求报网络错误:

Error SendMailMonthLock - TypeError: Network request failed

后端无响应。我试过RN Fetch Blob,但它仅支持纯React Native项目,不适用于Expo。


补充:尝试使用Multer的失败情况

前端代码

async sendMonthReportMail(file) {
  fdPost.append("file", file);
  fdPost.append("senderUser", "name");
  fdPost.append("recieverMail", "mail@mail.com");

  await fetch(`${connectionString}/api/mails/sendmonthreportTest`, {
    method: "POST",
    headers: {
      Accept: "application/json",
      'Content-Type': 'multipart/form-data'
    },
    body: fdPost                                
  })
  .catch(err => console.log("Error SendMailMonthLock - " + err))
}

后端代码

router.post("/sendmonthreportTest", upload.single("file"), (req, res) => {                                                                  
  console.dir(req.file + req.body); 
})

仍出现相同的网络错误,用Postman调用该接口时返回500错误:

POST /api/mails/sendmonthreportTest 500 6.952 ms - 1221
TypeError: Cannot convert object to primitive value

fetch前打印的fdPost内容:

{"_parts":[["file",{"size":69496,"name":"Monatsbericht_User_Name_Dezember2022.pdf","type":"success","uri":"file:///data/user/0/host.exp.exponent/cache/ExperienceData/%2540yxxx%252Fxxx/DocumentPicker/2xx07e4-4136-4b6f-ad70-26xxac64064.pdf","mimeType":"application/pdf"}],["senderUser","User Name"],["recieverMail","user@mail.com"]]}

请问如何正确发送PDF的实际内容?


内容的提问来源于stack exchange,提问作者yesIamFaded

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:05:20