【问题标题】:How to set up an Express route with parameters如何使用参数设置 Express 路由
【发布时间】:2020-06-16 13:29:49
【问题描述】:

我正在构建一个 MEVN 堆栈 CRUD 应用程序(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();
});

...以便它根据数据的 id 从 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;

【问题讨论】:

  • 你能详细说明“没有工作”吗?你有什么错误吗?
  • 意思是,将{ _id: mongodb.ObjectId(req.params.id)} 传递给collection.find() 不会成功根据数据的id 从MongoDB 返回特定数据。换句话说,调用中请求的特定数据不会作为 Express 路由的响应返回。
  • @JS_is_awesome18 你在这两种情况下都获得了该集合的完整数据吗?
  • 是的,我通过运行 res.send(await collection.find({}).toArray()); 获得了完整的数据,但我想在 /view/:id 路由中配置相同的响应,以便它只返回特定于该 ID 参数的数据。
  • 在发送到过滤器之前尝试记录mongodb.ObjectId(req.params.id)

标签: javascript node.js mongodb express vue.js


【解决方案1】:

你最好使用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);
});

【讨论】:

【解决方案2】:

如果您需要来自数据库的特定数据,那么您需要使用 findById 方法并传递您的 id 而不是 find 方法:

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({}); });

【讨论】:

    【解决方案3】:

    您需要在查找查询中传递过滤器,即

    
    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()

    【讨论】:

    • 这是有道理的,但它仍然会向前端发送响应。同时,数据现在不会返回到控制台。
    • 您能详细说明一下您的要求吗?
    猜你喜欢
    • 2020-04-09
    • 2017-11-23
    • 2016-02-24
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    相关资源
    最近更新 更多