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
相关产品推荐
相关产品推荐

