尽管映射正确,Node/ Express Rest API 仍继续进入相同的控制器功能

Node/ Express Rest API keeps entering same controller function inspite of correct mapping

我在写node/express休息api.

命中, http://localhost:5000/api/news

http://localhost:5000/api/news/?id=c5f69d56be40e3b56e55d80

两者都给我所有的新闻对象,因为它为两个网址输入了相同的 .getNews 函数。

我的控制器:

const NewsController = {};
const News = require('../models/news.model');

// This implementation of getNews is using Promises
NewsController.getNews = function(req, res) {

  console.log('Inside getNews');
  sendResponse = function(arg) {
    res.json(arg);
  }

  const allnews = News.find({}, function(err, ns) {
    sendResponse(ns);
  });


};


// ES6 style
NewsController.getSingleNews = async (req, res) => {

  console.log("Inside getSingleNews");
  const news = await News.findById(req.params.id);
  res.json[news];
};


NewsController.createNews = async (req, res) => {
  const news = new News(req.body);
  await news.save();

  res.json[{
    'status': 'item saved successfully'
  }];
};

NewsController.deleteNews = async (req, res) => {
  await News.findByIdAndRemove(req.params.id);
  res.json[{
    'status': 'item deleted successfully'
  }]
};


module.exports = NewsController;

我的routes.js(我在/api使用路由器。所以app.js有//使用路由器

app.use('/api', newsRoutes);

)

const express = require('express');
const router = express.Router();
var newsController = require('../controllers/NewsController')

router.get('/news', newsController.getNews);
router.get('/news/:id', newsController.getSingleNews);
router.post('/news', newsController.createNews);
router.delete('news/:id', newsController.deleteNews);

module.exports = router;

我的模型

const mongoose = require('mongoose');


const { Schema } = mongoose;
const newsSchema = new Schema({
  title: { type: String, required: true },
  content: { type: String, required: true },
  author: { type: String },
  image: { type: String },
  source: { type: String }
});

module.exports = mongoose.model('news', newsSchema);

首先使用/news/:id。您的请求将被重定向到声明顺序后第一个匹配的 url。

所以/api/news满足app.get(/news)?是的,被重定向到那个控制器。 /api/news/?id=c5f69d56be40e3b56e55d80 满足app.get(/news)?是的,也被重定向到 /news 控制器。

顺便说一下,当您从 req.params 获取 id 时,您应该使用 /news/c5f69d56be40e3b56e55d80。如果您要从 req.query 获取它,则不需要其他路线。 /news?id=c5f69d56be40e3b56e55d80 将是完美的,您只需要检查 req.query.

是否存在

您的代码的问题在于您尝试调用端点的方式。 快递路线与查询字符串参数不匹配

话虽如此,您对 news 端点的调用如下所示:

http://localhost:5000/api/news/?id=c5f69d56be40e3b56e55d80

应该看起来像这样:

http://localhost:5000/api/news/c5f69d56be40e3b56e55d80

这样 id 参数将映射到 req.params.id 属性 中的 getSingleNews 控制器。

作为您声明路线方式的预期行为:

router.get('/news/:id', newsController.getSingleNews);

有关快速路线如何运作的更多信息,请查看此处的文档:https://expressjs.com/en/guide/routing.html