Как настроить маршрут Express с параметрами - PullRequest
0 голосов
/ 04 марта 2020

Я создаю приложение CRUD для стека MEVN (Vue, Node, Express, MongoDB). Я пытаюсь настроить следующий Express маршрут для моего приложения ...

postRoutes.get('/view/:id', async (req, res) => {
  const collection = await loadPostsCollection();
  let id = req.params.id;
  res.send(await collection.find({}).toArray());
  res.status(201).send();
});

... так, чтобы он возвращал определенные c данные из MongoDB на основе идентификатора этих данных. Я не уверен, как настроить res.send, чтобы он находил данные на основе req.params.id. Я попытался передать req.params.id так ...

postRoutes.get('/edit/:id', async (req, res) => {
  const collection = await loadPostsCollection();
  let id = req.params.id;
  res.send(await collection.find({ _id: mongodb.ObjectId(req.params.id)}).toArray());
  res.status(201).send();
});

... но это тоже не сработало. Любая идея, как настроить этот маршрут, чтобы он находил данные на основе параметра ID? Спасибо!

Моя полная Express страница маршрутизатора находится ниже:

const express = require('express');
const postRoutes = express.Router();
const mongodb = require('mongodb')


postRoutes.get('/', async (req, res) => {
  const collection = await loadPostsCollection();
  res.send(await collection.find({}).toArray());
});


postRoutes.post('/add', async (req, res) => {
  const collection = await loadPostsCollection();
  let task = req.body;
  await collection.insertOne(task);
  res.status(201).send();
});

postRoutes.get('/view/:id', async (req, res) => {
  const collection = await loadPostsCollection();
  let id = req.params.id;
  res.send(await collection.find({}).toArray());
  res.status(201).send();
});

postRoutes.delete('/delete/:id', async (req, res, next) => {
  const collection = await loadPostsCollection();
  collection.deleteOne({ _id: mongodb.ObjectId(req.params.id) });
  res.status(200).send({});
});

async function loadPostsCollection() {
  const client = await mongodb.MongoClient.connect(
    '...',
    {
      useNewUrlParser: true
    }
  );
  return client.db("test").collection("todos")
}

module.exports = postRoutes;

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Вам лучше использовать findOne метод, подобный этому:

const { ObjectID } = require("mongodb");

postRoutes.get("/view/:id", async (req, res) => {
  const collection = await loadPostsCollection();
  let id = req.params.id;

  let result = await collection.findOne({
    _id: new ObjectID(id)
  });

  if (!result) {
    return res.status(400).send("Not found");
  }

  res.status(200).send(result);
});
0 голосов
/ 04 марта 2020

Если вам требуется указать c данные из БД, поэтому вам нужно использовать метод findById и передать свой идентификатор вместо find method:

postRoutes.get('/edit/:id', async (req, res) => { const collection = await loadPostsCollection(); let id = req.params.id; res.send(await collection.findById(id).toArray()); res.status(201).send(); });

postRoutes.get('/view/:id', async (req, res) => { const collection = await loadPostsCollection(); let id = req.params.id; res.send(await collection.findById(id).toArray()); res.status(201).send(); }); 

postRoutes.delete('/delete/:id', async (req, res, next) => { const collection = await loadPostsCollection(); collection.deleteOne({ _id:req.params.id}); res.status(200).send({}); });
0 голосов
/ 04 марта 2020

Вам необходимо передать фильтр в запросе поиска, т.е.


postRoutes.get('/view/:id', async (req, res) => {
  const collection = await loadPostsCollection();
  let id = req.params.id;
  const o_id = new mongo.ObjectID(id);
  const result=await collection.find({ id: o_id });
  res.status(201).send(result.toArray());
});

Также вы не можете отправить ответ дважды для одного запроса, поэтому пропустите один resp.send().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...