人
我正在做一个非常简单的API(localhost开发),我很好奇为什么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);
从我的应用中,我将这些网址称为最后一条路线:
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}');
});
但是,如果我不能使用两个已定义的参数,它将无法使用额外的可选参数,对吧?
任何建议都非常感谢。
谢谢。
答案 0 :(得分:1)
你的处理程序中有太多的参数 - 带有四个参数的函数处理程序被保留用于错误处理,即仅在调用中间件链next(error)
中的某个地方时调用,或者捕获到异常。请阅读docs以获取更多信息。
// 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))
})