我正在尝试将Express中的一些路由及其处理程序逻辑拆分为单独的文件。我已经看到了类似于JS的示例目录结构,其中使用了单独的路由和控制器文件,因此我正在尝试实现这种方法但是遇到了问题。
我的服务器和路由配置如下:
server.js
var express = require('express'),
app = express(),
bodyParser = require('body-parser'),
routes = require('./routes/index')
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
routes(app);
/routes/index.js
module.exports = function(app) {
var catalogues = require('../routes/catalogues');
app.use('/catalogues-api', catalogues);
};
/routes/catalogues.js
var catalogues = require('../controllers/catalogues');
module.exports = function(app) {
app.route('/catalogues')
.get(catalogues.apiGET)
.post(catalogues.apiPOST);
};
/controllers/catalogues.js
var request = require('request');
exports.apiGET = function(req, res) {
var options = prepareCataloguesAPIHeaders(req);
request(options, function(err, response, body){
res.send(body);
});
};
exports.apiPOST = function(req, res) {
var options = prepareCataloguesAPIHeaders(req);
options.json = true;
options.body = stripBody(req.body);
request(options, function(err, response, body){
res.send(body);
});
};
当运行应用程序并对/ catalogs-api / catalogs发出GET请求时,我从节点抛出错误:
TypeError:undefined不是函数 在module.exports(C:\ Users \ rparker \ Documents \ GitHub \ testproj \ src \ server \ routes \ catalogues.js:4:7)
这是在我的/routes/catalogues.js文件中引用app.route声明。我在设置中显然遗漏了一些东西,但我无法理解。
有人可以帮忙吗? 感谢
答案 0 :(得分:9)
var express = require('express');
var router = express.Router();
var catalogues = require('../controllers/catalogues');
router.route('/catalogues')
.get(catalogues.apiGET)
.post(catalogues.apiPOST);
module.exports = router;
的最后一部分
答案 1 :(得分:1)
您可以在 npm 中找到名为“require.all”的非常好的自动加载器,它可以帮助您自动化链接路径,控制器和模型的过程。在文档的最后给出了类似的示例,假设所有路由文件都导出了将控制器作为参数并返回express.Router对象的函数。