2016-08-07 2 views
2

У меня есть две настройки приложений для экспресс-приложений. Один из них будет служить API-интерфейсу, а другой будет обслуживать мое однопользовательское приложение. Оба приложения затем устанавливаются в главном приложении. Я хотел бы только отправлять запросы к приложению apiServer, если входящий запрос принимает JSON.Как пропустить экспресс-приложение для запросов, которые не принимают 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. Идея состоит в том, что они должны перетекать в реакционный сервер. Это что-то, что можно сделать?

ответ

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

Отличный вопрос. На самом деле, похоже, нет способа сделать то, что вы хотите, чтобы выразить. При поиске через известных проблем, однако, оказывается, по крайней мере один другой человек 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^