我正在尝试为我的调查创建应用程序实现删除功能。
我正在将MongoDB和mongoose用于数据库,将node.js / Express用于后端服务器,将React / Redux用于前端。
尽管我认为我正确设置了路由,但在axios.delete()上却得到404(未找到)。
该错误表明找不到http://localhost:3000/api/surveys/delete/{the-survey-id-here}
。
我一直在阅读axios,Express,猫鼬和其他网站的文档,但是,对我没有任何帮助。
我尝试了以下操作。
surveyId
中传递const response = await axios.delete("/api/surveys", data: { surveyId });
<a></a>
代替<button></button>
这是我的密码。
SurveyList.js(具有删除按钮的反应组件)
import { fetchSurveys, deleteSurvey } from '../../actions'
...
<div className="card-action">
<a className="red-text text-accent-1">Yes: {survey.yes}</a>
<a className="red-text text-accent-1">No: {survey.no}</a>
<button
className="btn-floating btn-small waves-effect waves-light red right"
onClick={() => this.props.deleteSurvey(survey._id)}
>
<i className="material-icons">delete_forever</i>
</button>
</div>
...
const mapStateToProps = ({ surveys }) => {
return { surveys }
}
export default connect(
mapStateToProps,
{ fetchSurveys, deleteSurvey }
)(SurveyList)
actions / index.js(动作创建者)
export const deleteSurvey = (surveyId) => async dispatch => {
const response = await axios.delete(`/api/surveys/delete/${surveyId}`)
dispatch({ type: FETCH_SURVEYS, payload: response.data })
}
surveyRoute.js(路由处理程序)
app.delete('/api/surveys/delete/:surveyId', async (req, res) => {
await Survey.deleteOne({ _id: req.params.surveyId })
const surveys = await Survey.find({ _user: req.user.id }).select({
recipients: false
})
res.send(surveys)
})
server / index.js
const express = require('express')
const mongoose = require('mongoose')
const cookieSession = require('cookie-session')
const passport = require('passport')
const bodyParser = require('body-parser')
const keys = require('./config/keys')
require('./models/User')
require('./models/Survey')
require('./services/passport')
mongoose.connect(keys.mongoURI)
const app = express()
app.use(bodyParser.json())
app.use(
cookieSession({
maxAge: 30 * 24 * 60 * 60 * 1000, // milliseconds
keys: [keys.cookieKey]
})
)
app.use(passport.initialize())
app.use(passport.session())
require('./routes/authRoutes')(app)
require('./routes/billingRoutes')(app)
require('./routes/surveyRoutes')(app)
if(process.env.NODE_ENV === 'production'){
app.use(express.static('client/build'))
const path = require('path')
app.get('*',(req, res) => {
res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
})
}
const PORT = process.env.PORT || 5000
app.listen(PORT)
答案 0 :(得分:1)
In my case, leads/ is the end point. try your end point + survey id
With axios@^0.19.2
axios
.delete('/api/leads/' + id)
.then(res => {
dispatch({
type: DELETE_LEAD,
payload: id
});
答案 1 :(得分:0)
因此,如果我没有正确理解,则您有一个Expressjs应用程序和一个客户端应用程序运行在不同的端口上,如果是的话,我认为我发现了问题
您正在进行ajax调用,就好像前端和后端都在同一服务器上运行一样。这是两种可能的解决方案
如果您打算在不同的服务器上运行后端和前端,则将Axios删除操作的地址更改为指向正确的服务器
app.delete('http://localhost:5000/api/surveys/delete/:surveyId', async (req, res) => {
await Survey.deleteOne({ _id: req.params.surveyId })
const surveys = await Survey.find({ _user: req.user.id }).select({
recipients: false
})
res.send(surveys)
})
当然,在将其部署到生产环境中并启用CORS之后,您必须更改地址。
构建用于生产的客户端应用程序,此过程将编译所有的css,js和html并将其保存到在线上所述的client / build文件夹中
res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
这将导致前端和后端代码在同一服务器上运行
答案 2 :(得分:0)
非常感谢您提供所有答案和评论。问题是代理。我正在使用http-proxy-middleware
处理开发环境中不同端口之间的请求。关于端口的所有注释使我意识到我需要检查“ setupProxy.js”文件。我修改了文件中的代码,如下所示,该问题得以解决。
setupProxy.js
const proxy = require('http-proxy-middleware')
module.exports = function(app) {
app.use(proxy ('/auth/google', { target: 'http://localhost:5000' }))
app.use(proxy ('/api/**', { target: 'http://localhost:5000' }))
}
非常感谢您提供所有答案和评论。
答案 3 :(得分:-2)
必须在路由中间件中启用CORS(删除动词)。
This主题可能会对您有所帮助。