Axios> Express.router – Update(.put)方法返回404

时间:2019-10-08 13:07:06

标签: reactjs express mongoose axios

我正在尝试完成应用程序的最后一种CRUD方法的构建。 (C,R和D)全部完成。但是更新似乎很麻烦。我有一个将对象ID与新内容结合在一起的功能。我正在
Error: Request failed with status code 404
打印到控制台。

我认为我无法使用ID来访问数据库项。

收集数据并发起请求的功能

  handleClick(e) {
    e.preventDefault()
    const data = {
      id: this.props.sid, //someuniqueid
      body: {
        name: this.state.name, //foo
        details: this.state.details, //bar
        content: this.state.content, //baz
      },
    }
    api
      .updateSnippet(data)
      .then(result => {
        this.setState({
          name: '',
          details: '',
          content: '',
          message: `'${this.state.name}' has been created`,
        })
        setTimeout(() => {
          this.setState({
            message: null,
          })
        }, 2000)
        console.log('UPDATE DATA SUCCESS!')
      })
      .catch(err => this.setState({ message: err.toString() }))
  }


api.js-使用axios触发请求(这可能是我失败的地方)。

import axios from 'axios'

const service = axios.create({
  baseURL:
    process.env.NODE_ENV === 'production'
      ? '/api'
      : 'http://localhost:5000/api',
  withCredentials: true,
})

const errHandler = err => {
  console.error(err)
  if (err.response && err.response.data) {
    console.error('API response', err.response.data)
    throw err.response.data.message
  }
  throw err
}

export default {
  service: service,

  updateSnippet(data) {
    console.log(data.id) //someuniqueid
    console.log(data.body) //{name: "foo", details: "bar", content: "baz"}
    return service
      .put('/snippets' + data.id, {
        data: data.body,
      })
      .then(res => res.data)
      .catch(errHandler)
  },

}


Snippet.js(模式)

const mongoose = require('mongoose')

const snippetSchema = new mongoose.Schema({
  name: {
    type: String,
    required: [true, 'The snippet name is required'],
    minlength: 1,
  },
  details: {
    type: [String],
    default: [],
  },
  content: {
    type: String,
  },
})

const Snippet = mongoose.model('Snippet', snippetSchema)

module.exports = Snippet


“ routes / snippets.js”中的相关路线-这也可能是我摔倒的地方

router.put('/', function(req, res) {
  console.log(req.body)
  Snippet.findByIdAndUpdate(
    req.body.id,
    {
      name: req.body.name,
      details: req.body.details,
      content: req.body.content,
    },
    { new: true },
    function(err, response) {
      if (err) {
        console.log('we hit an error' + err)
        res.json({
          message: 'Database Update Failure',
        })
      }
      console.log('This is the Response: ' + response)
    }
  )
})

1 个答案:

答案 0 :(得分:0)

您要在网址中发送ID,因此您需要从req.params.id进行解析。 我也返回了回复。

routes / snippets.js

router.put("/:id", function(req, res) {
  console.log(req.body);
  Snippet.findByIdAndUpdate(
    req.params.id,
    {
      name: req.body.name,
      details: req.body.details,
      content: req.body.content
    },
    { new: true },
    function(err, response) {
      if (err) {
        console.log("we hit an error" + err);
        return res.json({
          message: "Database Update Failure"
        });
      }
      return res.send(response);
    }
  );
});

此外,您需要在api.js中更新此行。只需在片段后添加

   .put('/snippets' + data.id, {     => 
   .put('/snippets/' + data.id, {