简体   繁体   中英

Can i add mongodb _id to localhost adress to display one post from database?

I have set up my project to display posts from a MongoDB database. My localhost address is http://localhost:5000/api/posts and it displays my two saved posts. How can I add MongoDB _id to localhost adress to only display one post?

MongoDB _id: 6061890d59ec3b6abcb011fb

I have tried this:

  1. http://localhost:5000/api/posts/6061890d59ec3b6abcb011fb
  2. http://localhost:5000/api/posts/id:6061890d59ec3b6abcb011fb
  3. http://localhost:5000/api/posts/_id:6061890d59ec3b6abcb011fb

All of them returns error Cannot GET /api/posts/and_the_above_parameters_for_each_example`

Index.js to connect my backend to my application.

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

const app = express();

//Middleware
app.use(bodyParser.json());
app.use(cors());

const posts = require("./routes/api/posts");

app.use("/api/posts", posts);

const port = process.env.PORT || 5000;

app.listen(port, () => console.log(`Server started on port ${port}`));

posts.js to connect to MongoDB database. Below Password, MY_DATABASE and TABLE is changed to real values in my code.

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

const router = express.Router();

//Get posts
router.get("/", async (req, res) => {
  const posts = await loadPostCollection();
  res.send(await posts.find({}).toArray());
});

//Add post
router.post("/", async (req, res) => {
  const posts = await loadPostCollection();
  await posts.insertOne({
    text: req.body.text,
    createdAt: new Date(),
  });
  res.status(201).send();
});

router.delete("/:id", async (req, res) => {
  const posts = await loadPostCollection();
  await posts.deleteOne({
    _id: req.params.id,
  });
  res.status(200).send();
});

async function loadPostCollection() {
  const client = await mongodb.MongoClient.connect(
    "mongodb+srv://MongoDB:PASSWORD@cluster0.5pnzd.mongodb.net/MY_DATABASE?retryWrites=true&w=majority",
    {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    }
  );

  return client.db("MY_DATABASE").collection("TABLE");
}

module.exports = router;

PostService.js to display posts on localhost and methods to post and delete.

import axios from "axios";

const url = "http://localhost:5000/api/posts/";

class PostService {
  // Get posts
  static getPosts() {
    return new Promise((resolve, reject) => {
      axios
        .get(url)
        .then((res) => {
          const data = res.data;
          resolve(
            data.map((post) => ({
              ...post, //spread operator
              createdAt: new Date(post.createdAt),
            }))
          );
        })
        .catch((err) => {
          reject(err);
        });
    });
  }

  // Create posts
  static insertPost(text) {
    return axios.post(url, {
      text,
    });
  }

  static deletePost(id) {
    return axios.delete(`${url}${id}`);
  }
}

export default PostService;

Number 1: http://localhost:5000/api/posts/6061890d59ec3b6abcb011fb is correct, but you're going to need to create a new route to handle that request.

These are often called 'show' routes.

router.get("/:id", async (req, res) => {
  // code to handle the logic of that request
  // access the url parameter via: req.params.id
});
router.get("/:id", async (req, res) => {
  const posts = await loadPostCollection();
  res.send(await posts.findOne({
    _id: req.params.id,
  }));
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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