2016-08-07 8 views
2

Expressサブアプリケーションを2つ設定しました。 1つはバックエンドAPIを提供し、もう1つは私の反応である「単一ページアプリケーション」に役立ちます。両方のAppsはメインアプリにマウントされます。着信要求がJSONを受け入れる場合にのみ、apiServerサブアプリケーションにリクエストを送信したいと思います。JSONを受け付けないリクエストに対してエクスプレスサブアプリケーションをスキップする方法

これまで私がこれまで持っていたことは次のとおりです。

const express = require('express'); 

// two express sub apps 
const reactServer = require('./reactServer'); 
const apiServer = require('./apiServer') 

const app = express(); 

// middelware to check for json 
const onlyJSON = (req, res, next)=>{ 
    if(req.headers.accept.indexOf('json') === -1){ 
    next('route') // this doesn't appear to work 
    }else{ 
    next() 
    } 
} 

app.use('/api', onlyJSON, apiServer); 
app.use('/', reactServer); 
app.listen(3000); 

これは機能しません。ブラウザからのリクエストは、依然としてapiServerによって処理されます。アイデアは、それらがreactServerに流れるべきだということです。これは何かできるのでしょうか?

答えて

0

あなたはapp.all()代わりのapp.use()を使用する場合はそれを動作させることができます。

クイック例:

let apiRouter = express.Router(); 
let reactRouter = express.Router(); 

const onlyJSON = (req, res, next)=>{ 
    if(req.headers.accept.indexOf('json') === -1){ 
    next('route'); 
    } else{ 
    next() 
    } 
} 

apiRouter .use((req, res) => res.send('api')); 
reactRouter.use((req, res) => res.send('react')); 

app.all('/api*', onlyJSON, apiRouter); 
app.all('*', reactRouter); 

私はapp.use()がルートとはみなされませんので、next('route')が動作しないので、それはだと思います。

+0

これは動作するようです。私はサブルータでフルパスを使用する必要があります。 'router.get(/ api/test)'のようなものです。 'app.use()'は 'router.get(api/test)'だけを使用します。しかし、私はそれを得る。これは本当に「ルート固有のミドルウェア」に似ています。だから 'next( 'route')が動作します。 – toddgeist

0

優秀な質問です。あなたが表現しようとしていることをする方法は実際にはありません。報告された問題を検索するには、しかし、それは、少なくとも1つの他の人also wants that featureが判明し、実際には何が必要ないように見えることpitstop moduleを書いた:

const pitstop = require('pitstop'); 

const apiIfJson = pitstop() 
    .condition((req, res, next) => next(req.headers.accept.indexOf('json') !== -1)) 
    .use(apiServer); 

app 
    .use('/api', apiIfJson) 
    .use('/', reactServer) 
    .listen(3000); 
関連する問題