尽管映射正确,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
我在写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