expressjs路由:特定的路由不被识别

乡亲。

我正在做一个非常简单的API(本地主机开发),我很好奇为什么ExpressJS服务器从来没有得到最后的路线。

这里是路线:

var express = require('express'); var bodyParser = require('body-parser'); var router = express(); // (...) other variables defined here... router.all('*', function(req, res, next) { res.header('Access-Control-Allow-Origin', 'localhost'); res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS'); res.header('Access-Control-Allow-Headers', 'Content-Type'); next(); }); // Works great! router.get('/', function(req, res) { res.render('index'); }); // Works great! router.get('/api/states', function(req, res) { res.json(states); }); // Works great! router.get('/api/cities/:state', function(req, res, state) { res.json(cities); }); // Never Works!! router.get('/api/stores/:state/:city', function(req, res, state, city) { res.json('{"result": true}'); }); router.use(express.static(__dirname + '/../../www')); router.set('views', __dirname + '/../../www'); router.engine('html', require('ejs').renderFile); router.set('view engine', 'html'); router.listen(process.env.PORT || 9000); 

从我的应用程序,我把这些URL调用到最后一个路线:

 http://localhost/api/stores/sp/city_name 

它总是404。

我根本无法理解,为什么这是404。最后的路线,女巫从来没有工作,基本上是从以前的路线(这很好)的副本。

有人能指出我在这里做错了吗?

ps:最后一个路线应该接受第三个可选参数。 我也试过这个:

 // Never Works!! router.get('/api/stores/:state/:city/*?', function(req, res, state, city) { res.json('{"result": true}'); }); 

但是,如果我不能使用两个已定义的参数进行工作,那么它将不能使用额外的可选参数,对吧?

任何build议是非常感激。

谢谢。

在处理函数中有太多的参数 – 函数处理程序中有四个参数被保留用于error handling,也就是只有在调用中间件链next(error)地方时才调用,或者发生exception。 阅读文档以获取更多信息。

 // Remove `state` and `city` arguments, access via `req.params.*` router.get('/api/stores/:state/:city', function(req, res) { var state = req.params.state var city = req.params.city res.json('{"result": true}'); }); 

你没有得到其他处理程序的404是因为你接受三个参数。 所以我应该指出, state参数不会是你期望的,它将是一个调用下一​​个通常命名为next中间件的函数。

 // NOPE! function (req, res, state) router.get('/api/cities/:state', function(req, res) { var state = req.params.state res.json(cities); }); // Common middleware handler, third parameter is a function that when invoked will call the next middleware router.get('/some/uri', function (req, res, next) { doSomethingAsync() .then(data => { req.data = data next() }) .catch(err => next(err)) })