简体   繁体   English

如何在 React JS 中获取 API 并将数据保存到 MongoDB

[英]How to fetch API in React JS and save the data to MongoDB

I try to fetch an API and save the data to MongoDB, but i think i have some problem with my POST method.. I would like to store the data what i fetch from the API and then if i change data in the front i would like if it changed in the database Here is my code snippet:我尝试获取 API 并将数据保存到 MongoDB,但我认为我的 POST 方法有问题。我想存储从 ZDB974238714CA8DE634A7CE1D083A1 中获取的数据,然后如果更改前面 iF 中的数据就像它在数据库中改变了这是我的代码片段:

App.js file应用程序.js 文件

class App extends React.Component {
  state = {
    name: "",
    movie: [],
  };

  componentDidMount = () => {
    this.getMovie();
    this.displayMovie();
  };

  getMovie = () => {
    axios.get("http://api.tvmaze.com/shows?page=1").then((response) => {
      const data = response.data;
      this.setState({
        movie: data,
      });
      console.log("Data has been received");
      console.log(this.state.movie);
    });
  };
  displayMovie = () => {
    axios({
      url: "/",
      method: "POST",
      data: this.state.movie,
    })
      .then(() => {
        console.log("Data has been sent to the server");
        this.getMovie();
      })
      .catch((err) => {
        console.log(err);
        console.log("Internal server error");
      });
  };

  render() {
    return (
      <div>
        <form onSubmit={this.displayMovie}>
          <button type="submit">Send</button>
          <h2>Movie List</h2>
          <div>
            {this.state.movie.map((t) => {
              return <p>{t.name}</p>;
            })}
          </div>
        </form>
      </div>
    );
  }
}

export default App;

server.js file server.js 文件

const express = require("express");
const mongoose = require("mongoose");

const bodyParser = require("body-parser");

const app = express();
const movieRouter = require("./routes/movie.routes");

const connect = () => {
  return mongoose
    .connect("mongodb://localhost:27017/movie", {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    })
    .then(() => console.log("db connected"))
    .catch((err) => console.log(err));
};

connect();

app.use(express.json());
app.use("/", movieRouter);

app.use(bodyParser.json({ limit: "50mb", extended: true }));
app.use(bodyParser.urlencoded({ limit: "50mb", extended: true }));

app.listen(5000, () => {
  console.log("app is running on 5000");
});

model Schema model 架构

const mongoose = require("mongoose");

const movieSchema = new mongoose.Schema({
  name: {
    type: String,
  },
});

const MovieSchema = mongoose.model("movieSchema", movieSchema);
module.exports = MovieSchema;

service js file服务js文件

const MovieSchema = require("../models/movie.models");

const getMovie = async () => {
  const movie = await MovieSchema.find();
  return movie;
};

module.exports = {
  getMovie,
};

controller file controller 文件


const getMovie = async (req, res, next) => {
  try {
    const movie = await movieService.getMovie();
    res.status(200).json({ result: movie });
  } catch (err) {
    next(err);
  }
};

module.exports = {
  getMovie,
};


router file路由器文件

const express = require("express");
const router = express.Router();
const movieController = require("../controllers/movie.controllers");

router.get("/", movieController.getMovie);

module.exports = router;

What am i doing wrong?我究竟做错了什么? I have POST http://localhost:3000/ 404 (Not Found) error message.我有 POST http://localhost:3000/ 404(未找到)错误消息。

Thank you for help!谢谢你的帮助!

In your code, you have only specified a GET route for / .在您的代码中,您只为/指定了一个 GET 路由。 You also need to specify a POST route too.您还需要指定一个 POST 路由。

const express = require("express");
const router = express.Router();
const movieController = require("../controllers/movie.controllers");

router.get("/", movieController.getMovie);
router.post("/", movieController.saveMovie);

module.exports = router;

I put in movieController.saveMovie as a placeholder for whatever gets invoked at this route.我将movieController.saveMovie作为占位符放入此路由中调用的任何内容。 That part is up to you.那部分取决于你。 I didn't see a method for it in your code snippets to save it.我没有在您的代码片段中看到保存它的方法。

First of all your POST route handler is missing (ref: Andrew Nolan).首先,您的 POST 路由处理程序丢失(参考:Andrew Nolan)。 Secondly your react code App.js componentDidMount method is calling getMovie and straight after calling displayMovie.其次,您的反应代码App.js componentDidMount 方法正在调用 getMovie 并在调用 displayMovie 之后直接调用。 It has to wait till getMovie method returns the results.它必须等到 getMovie 方法返回结果。 So i placed promises to solve it.所以我承诺解决它。

class App extends React.Component {
  state = {
    name: "",
    movie: [],
  };

  async componentDidMount() {
    try {
      await this.getMovie();
      this.displayMovie();
    } catch (e) {
      console.log(e);
    }
  };

  getMovie = async () => {
    return new Promise((resolve, reject) => {
      axios.get("http://api.tvmaze.com/shows?page=1").then(({ data }) => {
        this.setState({
          movie: data,
        });
        resolve();
      }).catch(e => reject(e));
    });
  };

  displayMovie = async () => {
    axios({
      url: "/",
      method: "POST",
      data: this.state.movie,
    })
    .then(() => this.fetchMovie())
    .catch((err) => console.log(err));
  };

  render() {
    return (
      <div>
        <form onSubmit={this.displayMovie}>
          <button type="submit">Send</button>
          <h2>Movie List</h2>
          <div>
            {this.state.movie.map((t) => {
              return <p>{t.name}</p>;
            })}
          </div>
        </form>
      </div>
    );
  }
}

export default App;

You don't need to send status code 200 .您不需要发送状态码200 json method will stringify the json object and attach 200 status code as default. json 方法将字符串化 json object 并默认附加 200 状态代码。

res.status(200).json({ result: movie });   // too long
res.json({ result: movie });   // better practice
res.json({ movie });   // even better

When you are creating mongoose schema, you don't need to explicitly declare type of the data in object literals unless you want to add other configurations.当您创建 mongoose 模式时,您不需要在 object 文字中显式声明数据的类型,除非您想添加其他配置。

const movieSchema = new mongoose.Schema({
  name: {
    type: String,
  },
});
const movieSchema = new mongoose.Schema({
  name: String     // better
});

You are also missing post controller just like get, add post controller in controller file too.您还缺少 controller 后,就像获取一样,在 controller 文件中添加后 controller。

const postMovie = async (req, res, next) => {
const {name} = req.body;
  try {

  const newMovie = new Movie({
    name,
  });
   const movie = await newMovie.save();

    res.status(200).json({ result: movie });
  } catch (err) {
    next(err);
  }
};

module.exports = {
  postMovie,
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM