模块路由在Expess中不起作用
我原本是在一个api.js上写了我的路线,但我觉得有一个更好的方法,并绕过互联网,看看人们如何执行的东西。 我跟着几个教程,并提出了以下布局,其中server.js是我的开球:
-app --models --routes ---index.js ---settings.js ---sources.js server.js
我把我的路线发展到设置和来源,在index.js中调用它们,并在server.js中要求。 我希望一切都能正常工作,但是当我testing路由时,没有什么能解决/ settings或/ sources。 我不知道我错过了什么,但是我一直在考虑这个,我认为这可能是一些愚蠢的,我没有得到。 我不知道我错了什么过程的一部分,我一直在看它太久了! 任何帮助表示赞赏,谢谢!
server.js
var routes = require('./app/routes')(app, express) app.listen(config.port); console.log('Magic happens on port ' + config.port + '!');
index.js
module.exports = function(app, express){ require('./settings')(app, express); require('./sources')(app, express); }
settings.js(sources.js非常相似,所以为了简洁起见,我会留下这些)
var bodyParser = require('body-parser'); var Settings = require('../models/settings'); module.exports = function (app, express) { var router = express.Router(); //route for settings router.route('/settings') .get(function (req, res) { //check to see if any records exists ... }) .put(function (req, res) { ... }); return router }
更新:我摆脱了我的index.js文件,并将app.use语句放入server.js文件。 但是,如果不通过明确的论点,我就无法做到这一点。 我试着按照settings-2.js中的build议来回答,但没有骰子。
我做了什么: server.js
//routes! app.use('/', require('./app/routes/settings')(express)); app.use('/', require('./app/routes/sources')(express)); app.use('/settings2', require('./app/routes/settings-2')); //start it up app.listen(config.port);
新的settings.js
module.exports = function (express) { var apiRouter = express.Router(); //route for settings apiRouter.route('/settings') .get(function (req, res) { ... .put(function (req, res) { ... }); return apiRouter; }
settings-2.js这在localhost:8080 / settings2中不起作用。 没有错误,但请求只是在邮递员超时。
var Settings = require('../models/settings'); module.exports = function () { var apiRouter = require('express').Router(); //route for settings apiRouter.route('/') .get(function (req, res) { //check to see if any records exists ... }) .put(function (req, res) { ... }); return apiRouter; }
我会改变你如何设置你的路由器中间件工作稍有不同。 而不是传递express
模块,只包括路由器中的express
。 此外,没有理由传递app
因为您甚至没有使用它,而且是违反直觉的,因为它打破了使用路由器中间件试图build立的关注点的分离。
我想说看看如何构build你的快速应用程序的最好方法就是看看它生成的应用程序的快速生成器结构。
server.js
var express = require('express'); var bodyParser = require('body-parser'); var routes = require('./routes/index'); var app = express(); var port = process.env.PORT || 3000; app.use(bodyParser.json()); app.use('/', routes); app.listen(port);
index.js
var router = require('express').Router(); var settings = require('./settings'); var sources = require('./sources'); module.exports = function() { router.use('/settings', settings); router.use('/sources', sources); return router; }
settings.js
var router = require('express').Router(); module.exports = function() { router.route('/') .get(function(req, res) { // do GET /settings route work }) .put(function(req, res) { // do PUT /settings route work }) return router; }
sources.js
var router = require('express').Router(); module.exports = function() { router.route('/') .get(function(req, res) { // do GET /sources route work }) .put(function(req, res) { // do PUT /sources route work }) return router; }
同样在上面的代码中,它可能更index.js
摆脱index.js
代码,并将两个/settings
和/sources
中间件语句迁移到server.js
并将您的代码减less1个文件。 这将是一个更好的做法。
我没有看到你的代码片段中的任何地方,你挂载到路由器的应用程序。
例如:
index.js
module.exports = function(app, express){ app.use('/', require('./settings')(app, express)); app.use('/', require('./sources')(app, express)); }
我经常看到更像这样的布局:
app |-- server.js `-- routes |-- settings.js `-- sources.js
server.js
var express = require('express'); var app = express(); app.use('/settings', require('./routes/settings')); app.use('/sources', require('./routes/sources')); app.listen(port)
settings.js
var express = require('express'); var router = express.Router(); module.exports = router router.get('/', function(req, res, next) { ... }); router.put('/', function(req, res, next) { ... });