Node / Express Rest API продолжает вводить одну и ту же функцию контроллера, несмотря на правильное отображение - PullRequest
0 голосов
/ 22 февраля 2019

Я пишу нод / экспресс-отдых API.

Удар, http://localhost:5000/api/news

и

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

обадайте мне все объекты новостей, потому что он входит в одну и ту же функцию .getNews для обоих URL.

Мой контроллер:

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;

Мои маршруты.js (я использую роутер в / api. Поэтому в app.js // используется Router

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

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Проблема с вашим кодом заключается в том, как вы пытаетесь вызвать конечную точку. Экспресс-маршруты не соответствуют параметрам строки запроса .

Сказав это, ваш вызов конечной точки news выглядит следующим образом:

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

Вместо этого должно выглядеть так:

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

Таким образом, параметр id будет сопоставлен с требованием .Свойство params.id внутри вашего getSingleNews контроллера.

Предполагаемое поведение для способа, которым вы объявили свой маршрут:

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

Для получения дополнительной информации оКак работают экспресс-маршруты, смотрите документацию здесь: https://expressjs.com/en/guide/routing.html

0 голосов
/ 22 февраля 2019

Сначала используйте / news /: id.Ваш запрос будет перенаправлен на первый соответствующий URL-адрес, следующий за порядком объявления.

Итак, / api / news удовлетворяет app.get (/ news)?Да, перенаправляется на этот контроллер./ api / news /? id = c5f69d56be40e3b56e55d80 удовлетворяет app.get (/ news)?Да, также перенаправляется на / news controller.

Кстати, когда вы получаете идентификатор из req.params, вы должны использовать / news / c5f69d56be40e3b56e55d80.Если бы вы получили его из req.query, вам не понадобился бы другой маршрут./ news? id = c5f69d56be40e3b56e55d80 было бы идеально, вам просто нужно проверить наличие req.query.

...