2016-05-20 13 views
1

人。expressjsルート:特定のルートが認識されません

私は非常にシンプルなAPI(localhost development)をやっています。なぜ、最後のルートが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:最後のルートでは、3番目のオプションパラメータを使用する必要があります。

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

しかし、私はそれが定義された2つのパラメータでは動作しないことができれば、それは右の余分なオプションのパラメータ、では動作しません。また、私はこれをしようとしましたか?

アドバイスはありがたいです。

ありがとうございます。

+0

そのルートでインデックスをレンダリングできますか? – JordanHendrix

答えて

1

ハンドラに引数が多すぎます。4つの引数を取る関数ハンドラは、エラー処理のために予約されています。すなわち、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が表示されない理由は、3つの引数を受け入れるためです。だから私は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)) 
    }) 
+0

これはちょうど私がちょうど見つけたものです。どうもありがとうございます。 (詳細はhttp://expressjs.com/pt-br/4x/api.html#req)。ありがとう、もう一度、@ Nindaff。 – ppalmeida

+0

問題ないです、喜んで助けてください! – Nindaff

関連する問題