来自redux操作的PUT请求不起作用

我正在尝试通过对操作执行PUT请求来更新包含项目信息表单数据的MongoDB数据库,但无法在组件上获取handleSumbit函数来调用我的项目操作。我收到404错误。我不知道我缺少什么或做错了什么。任何见识将不胜感激。

我的组件:

import React,{ useState } from 'react'
import { connect } from 'react-redux'
import { Link } from 'react-router-dom'
import '../styles/ViewProject.css'

import { updateProjects } from '../actions/project.actions'


const EditProject = ({ project,match }) => {
  const [name,setName] = useState('')
  const [email,setEmail] = useState('')
  const [projectName,setProjectName] = useState('')
  const [projectType,setProjectType] = useState('')
  const [multiple,setMultiple] = useState(false)
  const [dueDate,setDueDate] = useState(Date)
  const [url,setUrl] = useState('')
  const [description,setDescription] = useState('')

const handleSubmit = e => {
  e.preventDefault()
  updateProjects(name,email,projectName,projectType,dueDate,url,description)
  console.log('Data ',name,projectName)
}

    return(
        <form classname="viewProjectContainer" onSubmit={handleSubmit}>

            {project.map((task,i) => ( 
            <div key={i++} >
                {match.params.id === task._id ? 
                <div classname="vp">
                    <div classname="vpLeft">
                        <div classname="vpTitle">
                            <input classname='vpProjectName' defaultvalue={task.projectName} onChange={e => setProjectName(e.target.value)} />
                        </div>
                        <div classname="vpSub">
                            <p>Submitted by: </p>
                            <label>Name: </label>
                            <input classname='vpName' defaultvalue={task.name} onChange={e => setName(e.target.value)}/>
                            <label>Email: </label>
                            <input classname='vpEmail' defaultvalue={email} onChange={e => setEmail(e.target.value)}/>
                        </div>
                        <div classname="vpDescription">
                            <label>{task.multiple === true ? "(Multiple)" : "Single"}</label>
                            <p>Project Type: </p>
                            <select classname='formInput' onChange={e => setProjectType(e.target.value)} defaultvalue={projectType}>
                              <optgroup label='Digital'>
                                <option value='banner'>Banner</option>
                                <option value='emailBlast'>Email Blast</option>
                                <option value='productImage'>Product Image</option>
                                <option value='socialMediaAd'>Social Media Ad</option>
                                <option value='video'>Video</option>
                                <option value='websiteMockup'>Website Mockup</option>
                                <option value='other'>Other  (Please be specific in Description)</option>
                              </optgroup>
                              <optgroup label='Physical Product'>
                                <option value='bottleOpener'>Bottle Opener</option>
                                <option value='clothing'>Clothing</option>
                                <option value='keyChain'>Key Chain</option>
                                <option value='popSocket'>Pop Socket</option>
                                <option value='usb'>USB</option>
                                <option value='other'>Other  (Please be specific in Description)</option>
                              </optgroup>
                              <optgroup label='Print'>
                                <option value='businessCard'>Business Card</option>
                                <option value='brochureBiFold'>Brochure - Bi-fold</option>
                                <option value='brochureTriSquare'>Brochure - Trifold Square</option>
                                <option value='brochureTriStandard'>Brochure - Trifold Standard</option>
                                <option value='catalogMore'>Catalog - Less than 50 pages</option>
                                <option value='catalogLess'>Catalog - More than 50 pages</option>
                                <option value='documentFull'>Document - Full Sheet</option>
                                <option value='documentHalf'>Document - Half Sheet</option>
                                <option value='flyer4x6'>Flyer - 4x6</option>
                                <option value='flyer5x7'>Flyer - 5x7</option>
                                <option value='flyer6x9'>Flyer - 6x9</option>
                                <option value='postCard4x6'>Post Card 4x6</option>
                                <option value='postCard5x7'>Post Card 5x7</option>
                                <option value='postCard6x9'>Post Card 6x9</option>
                                <option value='poster11x17'>Poster 11x17</option>
                                <option value='poster24x36'>Poster 24x36</option>
                                <option value='other'>Other  (Please be specific in Description)</option>
                              </optgroup>
                              <optgroup label='Other'>
                                <option value='consultation'>Consultation</option>
                                <option value='labeling'>Labeling</option>
                                <option value='other'>Other  (Please be specific in Description)</option>
                              </optgroup>
                            </select>
                            <div classname="vpDescBox">
                              <textarea classname='updateDescription' defaultvalue={description} onChange={e => setDescription(e.target.value)}></textarea>
                            </div>

                        </div>
                    </div>

                    <div classname="vpRight">
                        <div classname="vpTicket">
                            <p>Ticket Number: {task.ticketNumber}</p>
                            <label>Submitted: {task.date} </label>
                            <label>Preferred due date: </label>
                            <input type='date' defaultvalue={task.dueDate} onChange={e => setDueDate(e.target.value)}/>
                        </div>
                        <div>
                            <label>Reference links: </label>
                            <input type='text' defaultvalue={task.url} onChange={e => setUrl(e.target.value)}/>
                            <label></label>

                        </div>
                        <div>
                          <p>Project Status:</p>
                          <p>Task Recieved: {task.recieved === true ? "Recieved" : "Not Revieved"}</p>
                          <p>Task in progress: {task.inProgress === true ? "In Progress" : "Not in Progress"}</p>
                          <p>Completed: {task.completed === true ? "Complete" : "Incomplete"}</p>
                        </div>
                    </div>

            </div>: null}
            </div>

            ))}
            <div classname='buttonsContainer'>
            <button type='submit' classname='projectViewButton1'><Link to={'/' + match.params.id}>Save</Link></button>


            </div>
        </form>
    )

}

const mapstatetoProps = state => ({
    project: state.projects.project,id: state.projects.id
  })

  export default connect(
    mapstatetoProps,{ updateProjects }  
  )(EditProject)

我的动作

export function updateProjects(name,description) {
    console.log('reducer ',name)
    axios.put('api/projects/update/:id',{
        name: name,email: email,projectName: projectName,projectType: projectType,// multiple: multiple,dueDate: dueDate,url: url,description: description
    }).then(resp => {
        console.log("Data updated: ",resp.data)
    })
}

我的后端:

// @route   PUT api/projects/update/:id
// @desc    Update projects
// @access  Private
router.put('/update/:id',async (req,res) => {
  try {
    const {
      name,multiple,reference,attachment,description,ticketNumber,received,inProgress,completed
    } = req.body

    const project = await Project.findByIdAndUpdate(req.params.id,{
      name,completed
    })

   res.json(project);


  } catch (err) {
    console.error(err.message)
    res.status(500).send('Server Error')
  }
})

感谢您的帮助!

newer1106 回答:来自redux操作的PUT请求不起作用

您用axios.put命中的端点是api/projects/update/:id,这是不完整的。您也应该放置主机。例如:http://localhost:8000/api/projects/update/:id

而且,您还需要在URL中为:id指定一个适当的值。不确定是否出于示例目的将其遗漏,只是想指出那个也太哈哈了。

,

在您的react项目文件夹的package.json文件中:

"proxy":"http://localhost:8000"

您的http网址应在下面:

axios.put('/api/projects/update/',{
  params: {
    id: 'value of id'
  }
});

或:

 axios.put(`/api/projects/update/${value of id}`)
本文链接:https://www.f2er.com/3147484.html

大家都在问