2017-02-17 4 views
1

Я изучаю nodejs/expressjs и shoehorning его в шаблон Spring MVC, потому что я полагаю, что могу поддерживать связность моего файла. Но это не совсем работает так, как я бы ожидал ...expressjs - не удалось обработать запрос

server.js

const express = require('express'); 
const bodyParser= require('body-parser'); 
const MongoClient = require('mongodb').MongoClient; 
const app = express(); 

var PeopleController = require('./controller/PeopleController.js') 
var db; 

app.all('/*', function(req, res, next) { 
    var path = req.url; 
    var controller; 

    switch (true) { 
    case /\/people.*/g.test(path): 
     controller = new PeopleController(); 
     console.log("people"); 
     controller.process(req, res, next); 
     break; 
    case /\/foo.*/g.test(path): 
     console.log("foo"); 
     break 
    default: 
     console.log("nada"); 
     break; 
    } 
}); 

PeopleController.js

const express = require('express'); 
const bodyParser= require('body-parser'); 
const MongoClient = require('mongodb').MongoClient; 
const app = express(); 

var PeopleController = function PeopleController() {} 

PeopleController.prototype.process = function (req, res, next) { 
    var baseURL = '/people'; 

    console.log('path is ' + req.path); 

    app.use(bodyParser.urlencoded({extended: true})); 
    app.set('view engine', 'ejs'); 

    app.get(baseURL, (req, res) => { 
    console.log('people get'); 
    }); 

    app.post(baseURL, (req, res) => { 
    console.log('people post'); 
    }); 
}; 

module.exports = PeopleController; 

Тогда, когда я делаю GET на/человек/я получаю следующая консоль из ...

people 
path is /people/ 

Я ожидаю, что app.get бежать и получить следующий вывод:

people 
path is /people/ 
people get 
+0

Из того, что я вижу, вы создаете новый экземпляр 'app', но он не прослушивает ни один из портов , 'app.get' будет соответствовать запросу к порту, который он прослушивает. – char

ответ

1

Lurk Я бы очень рекомендовал использовать express.router так:

PeopleController.js 

const express = require('express'); 
const router = express.Router(); 

// then apply middleware 
router.use(...); 

// then define your endpoints 
router.get('/', (req, res) => { 
    console.log('get PeopleController.js root'); 
} 

module.exports = router; 

В server.js

... 
const PeopleController = require('./controller/PeopleController.js'); 

// apply PeopleController to '/people' route 
app.use('/people', PeopleController); 

Так что теперь, когда вы запрашиваете GET/людей вы должны увидеть console.log на узле. Большим преимуществом этого подхода является то, что он держит ваш код в чистом виде (без переключения по маршруту, вы можете выражать дескрипторные действия)

+0

Думаю, мне нравится этот подход лучше, чем другой подход. Можете ли вы применить эту концепцию маршрутизатора/контроллера для 'app.method', а не только для промежуточного программного обеспечения? – char

+0

Привет, не уверен, что я понимаю ваш вопрос. Шаблон здесь состоит в группировании конечных точек, например. предположим, что PeopleController имеет GET/sayHello и POST/воспроизведение, а AnimalController имеет конечные точки GET/makeNoise и POST/offspring. Вы должны «прикрепить» их с помощью app.use ('/ people', PeopleController) и app.use ('/ animal', AnimalController). Наконец, потребляйте их с помощью POST/животного/потомства. Если вы спрашиваете о группировке конечных точек методом (например, все вызовы GET в одном файле), то это другой шаблон, с которым я не знаком. – Kunal

+0

Это было чистое решение. Спасибо. – Lurk21

2

Это происходит потому, что у вас есть только один экземпляр Express, прослушивающий порт.

В server.js:

const express = require('express'); 
const bodyParser= require('body-parser'); 
const MongoClient = require('mongodb').MongoClient; 
const app = express(); // we create an instance of Express 
... 
app.listen(process.ENV.PORT); //this specific instance listening on port 

При создании нового экземпляра PeopleController вы должны мимо app в server.js

const app = express(); 
... 
controller = new PeopleController(app); 

и импорта в PeopleController.js

const express = require('express'); // delete this 
const app = express(); // delete this 

//add this: 
var PeopleController = function PeopleController(appInstance) { 
    this.app = appInstance; 
} 

PeopleController.prototype.process = function (req, res, next) { 
    var baseURL = '/people'; 
    var app = this.app; 

    console.log('path is ' + req.path); 

    app.use(bodyParser.urlencoded({extended: true})); 
    app.set('view engine', 'ejs'); 

    app.get(baseURL, (req, res) => { 
    console.log('people get'); 
    }); 

    app.post(baseURL, (req, res) => { 
    console.log('people post'); 
    }); 
};