我最初在一个api.js中编写了我的路线,但我认为有一种更好的方法并绕过互联网查看人们如何实现内容。我按照了几个教程,提出了以下布局,其中server.js是我的启动:
-app
--models
--routes
---index.js
---settings.js
---sources.js
server.js
我将我的路线分解为设置和来源,在index.js中调用它们并在server.js中要求它们。我希望一切都能正常工作,但是当我测试路线时,没有任何东西可以解析/ 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的回答中的建议,但没有骰子。
我做了什么: 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);
new 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;
}
设置 - 2.js 这不适用于localhost:8080 / settings2。没有错误,但请求只是在Postman中超时。
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;
}
答案 0 :(得分:2)
我会改变你设置路由器中间件的工作方式略有不同。您可以在路由器中包含express
,而不是绕过express
模块。此外,没有理由传递app
因为你甚至没有使用它并且它违反直觉,因为它打破了你试图通过使用路由器中间件建立的关注点的分离。
我想说看看如何构建Express应用程序的最佳方法是查看express-generator构建应用程序的方式。
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);
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;
}
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;
}
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
代码并将两个/settings
和/sources
中间件语句迁移到server.js
并减少代码由1个文件。这将是一种更好的做法。
答案 1 :(得分:0)
我没有在您的代码段中看到您将路由器安装到应用程序的任何位置。
例如:
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) { ... });