expressjs route:无法识别特定路由

时间:2016-05-20 02:37:48

标签: node.js express

我正在做一个非常简单的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}');
});

但是,如果我不能使用两个已定义的参数,它将无法使用额外的可选参数,对吧?

任何建议都非常感谢。

谢谢。

1 个答案:

答案 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))
  })