node.js - 使用react和node同时上传文件(图片)和数据
问题描述
我目前正在使用对服务器的两次调用上传图像和数据,我想将其减少到对服务器的一次调用。
我当前的前端代码如下。输入字段是:
<input
required
type="file"
onChange={this.fileUploaded}
/>
使用此代码上传到状态:
userEvent.image = new FormData()
userEvent.image.append('file', e.target.files[0])
this.setState({ userEvent })
使用此代码发送到后端:
let data = this.state.userEvent.image
let eventData = this.state.userEvent
eventData.token = localStorage.getItem("token")
axios.post(`${process.env.REACT_APP_API}/image`, data)
.then(res => {
axios.patch(`${process.env.REACT_APP_API}/events/${res.data._id}`, eventData)
.then(res => {console.log(res)})
.catch(err =>{console.log(err)})
})
.catch(err => {
console.log("imgerr", err)
})
我的后端代码(第一次调用服务器)是:
const Event = require('../models/events')
module.exports = (req, res) => {
let apiUrl = req.protocol + '://' + req.get('host') + '/'
let newEvent = {
imageURL: apiUrl + req.file.filename,
}
Event.create(newEvent)
.then(data => {
console.log('data', data)
res.send(data)
})
.catch(err => console.log(err))
}
当我尝试在一个对象中发送图像和数据时,我在后端收到一个错误,因为我这样做时 req.file 是未定义的。
我错过了什么?
解决方案
我想到了。
我将我保存的其他数据附加到我也想发送到后端的状态中。
对象数组需要被字符串化。
let userEvent = this.state.userEvent
console.log('userEvent.ticekts', userEvent.tickets);
let data = userEvent.image
data.append('title', userEvent.title)
data.append('venue', userEvent.venue)
data.append('description', userEvent.description)
data.append('startDetails', userEvent.startDetails)
data.append('endDetails', userEvent.endDetails)
data.append('token', localStorage.getItem("token"))
data.append('currency', userEvent.currency)
data.append('lat', userEvent.lat)
data.append('lng', userEvent.lng)
data.append('address1', userEvent.address1)
data.append('address2', userEvent.address2)
data.append('address3', userEvent.address3)
data.append('address4', userEvent.address4)
data.append('eventPassword', userEvent.eventPassword)
data.append('globalRefundPolicy', userEvent.globalRefundPolicy)
data.append('globalRefundOptions', JSON.stringify(userEvent.globalRefundOptions))
data.append('region', userEvent.region)
data.append('tickets', userEvent.tickets)
data.append('ticketTypesEquivalent', userEvent.ticketTypesEquivalent)
userEvent.tickets.forEach(item => {
data.append(`tickets[]`, JSON.stringify(item));
});
axios.post(`${process.env.REACT_APP_API}/image`, data)
.then(res => {
console.log('res', res)
})
.catch(err => {
console.log("imgerr", err)
})
推荐阅读
- java - 使用自定义证书和密钥调用 RestTemplate API
- cryptography - 在将密码存储到数据库之前将盐添加到密码中
- python - 如何使用 Google Directory API 在 members.get() 调用中“includeDerivedMembership”?
- flutter - Riverpod - ref.onDispose 在创建对象时调用,而不是在释放时调用
- rust - Rust 中的红黑树,得到“预期的结构节点,找到可变引用”
- android - OnBackPress 片段
- python - 在 django 视图中理解 request.data
- python - 如何在 python3 kubernetes 客户端中加载 2 个(或更多)不同的 kubeconfig?
- python - 使用 BeautifulSoup 将 XML 中的数据提取到 csv 文件中
- c++ - 在 C++ 中检查 Palidrome,一些输出正在工作,一些则没有