在调用ExpressJS REST路由时奇怪的行为

我正在制作一个包装TMDb API的简单REST服务器。 而且我正在使用MovieDB Node模块,它具有通过提供API密钥直接调用TMDb的API的function。

我有以下应用程序文件夹结构。

myproject | ---configuration.json ---index.js ---app.js ---/routes | --- index.js --- /movie | --- index.js 

myproject/index.js ,我有一个简单的启动Express服务器的脚本, app.js是我在初始化路由的地方。

MyProject的/ app.js

路线如何初始化

 var myApp = require("express")(), configuration = require("./configuration.json"); myApp.locals.tmdbApiKey = configuration.tmdbApiKey; myApp.use('/api', require('./routes')); 

如上所示,服务器的API根目录为localhost:9000/api/ (我在端口9000上运行它)。

的myproject /路线/ index.js

以下是我如何加载movie路线。

 var router = require('express').Router(); router.use('/movie', require('./movie')); 

MyProject的/路线/电影/ index.js

最后,我已经定义了如下的终点。

 var router = require('express').Router(); router.get('/genrelist', function(req, res) { var tmdb = require('moviedb')(req.app.locals.tmdbApiKey); tmdb.genreList(function(err, tmdbRes) { if (err) res.send(err); res.json(tmdbRes); }); }); --- --- 

用法

现在,调用http://localhost:9000/api/movie/genrelist应该通过使用moviedbgenreList()方法来moviedb TMDb API提供的stream派列表,以防我知道路由和路由映射是正确的。

不过,我得到以下回应。

 { "original": null, "response": { "req": { "method": "GET", "url": "https://api.themoviedb.org/3/movie/genrelist" }, "header": { "access-control-allow-origin": "*", "cache-control": "public, max-age=28800", "content-type": "application/json;charset=utf-8", "date": "Wed, 15 Jun 2016 11:33:51 GMT", "etag": "\"37a6259cc0c1dae299a7866489dff0bd\"", "server": "openresty", "status": "404 Not Found", "x-memc": "MISS", "x-memc-age": "0", "x-memc-expires": "28800", "x-memc-key": "35bba1a0c9464e4e471cdb466209d8b3", "x-ratelimit-limit": "40", "x-ratelimit-remaining": "38", "x-ratelimit-reset": "1465990436", "content-length": "84", "connection": "Close" }, "status": 404, "text": "{\"status_code\":34,\"status_message\":\"The resource you requested could not be found.\"}" }, "status": 404 } 

如果你看到response.req.url值,它会尝试调用https://api.themoviedb.org/3/movie/genrelist ,这显然是不正确的,因为TMDb API没有任何这样的端点。

但是,如果我更改myproject/routes/movie/index.js我的router.get如下所示:

 var router = require('express').Router(); router.get('/top_rated', function(req, res) { var tmdb = require('moviedb')(req.app.locals.tmdbApiKey); tmdb.miscTopRatedMovies(function(err, tmdbRes) { if (err) res.send(err); res.json(tmdbRes); }); }); 

它工作得很好,注意到我也把genreList()调用genreList()miscTopRatedMovies() 。 令人震惊的是,如果我按照genreList()保持对genreList()调用,那么它也会检索top_rated影片的列表。

甚至可怕的是,我在GET方法中做了console.log() ,它不logging任何东西。 即使使用node-debug来debugging服务器,如果我在GET中设置了断点,也不会中断执行。 所以我觉得我通过REST客户端的REST调用直接转换为TMDb API调用(可能是由于相同的REST签名),MovieDB根本没有被调用,但我不是100%确定。

所以,为了确定MovieDB模块本身是否有什么问题,我创build了一个简单的直接使用MovieDB的JS文件,并使用node命令运行它,并且对于我使用的所有方法都可以正常工作。

那么我在这里做什么错了?

任何帮助表示赞赏。

我发现问题是什么,这是一个愚蠢的。

在我的电影路线中,我有一个端点如下。

 router.get('/:movieId', function(req, res) { // Call tmdb.movieInfo() }); 

其余的终点也是以/开始,如下所示。

 router.get('/popular', function(req, res) { // Call tmdb.movieInfo() }); 

很显然,这是一个糟糕的devise,会造成麻烦,因为/:movieId将在有效的电影ID被传递时被调用,但是我也有其他使用关键字的点(与TMDb完全相同),所以当我尝试GET /popular ,MovieDB内部调用API由TMDb( /api/movie/popular也是TMDb的有效端点)确定,因此我得到了正确的结果。

但是,如果我做了GET /genres ,我的API认为字体genres/:movieId ,由于相同的签名,并没有这样的ID存在,它失败了。

我现在已经改正了我的终点

 router.get('/info/:movieId', function(req, res) { // Call tmdb.movieInfo() }); 

一切都如预期般运作。

学到的教训,从不会有涉及参数值和关键字的相同的终点。