Express路由器未安装

我正在做我的第一个项目使用expressjs和我有一个路由器没有安装的问题。 我基本上有应用程序安装一个路由器对象,然后应该挂载第二个路由器对象。 第一个embedded式路由器通过app.use命令成功挂载,而第二层embedded式路由器没有被第一层embedded式路由器挂载。 我需要比我聪明的人告诉我为什么我的方法不起作用。 所有的帮助,非常感谢。

请参阅下面的项目细节和代码片段。 在这里输入图像说明

app.js

var express = require('express'); var app = express(); //path to db controller and model scripts app.set('dbPath','/db'); //build connect string var host='localhost' var port='27017'; var dbName = 'Reckon_Orbs'; app.set('dbConnectString','mongodb://'+host+':'+port+'/'+dbName); var dbRouterMod = require('./routes/db/db_router.js'); var dbRouterContainer = new dbRouterMod(express,app.get('dbPath'),app.get('dbConnectString')); app.use('/db', dbRouterContainer.dbRouter); // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handlers // development error handler // will print stacktrace if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); } // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); }); module.exports = app; 

db_router.js

 var DbRouter = function(express,dbPath,connectString) { this.dbRouter = express.Router(); var userRouterMod = require('./user_router.js'); var userRouterContainer = new userRouterMod(express,dbPath,connectString); //this.dbRouter.get('/user',function(req,res){res.send("hello")}); this.dbRouter.use('/user',userRouterContainer.userRouter); console.log("db_router instantiated"); }; module.exports = DbRouter; 

user_router.js

 var UserRouter = function(express,dbPath,connectString){ this.userRouter = express.Router(); this.userRouter.get('/get',function(req,res){res.send("hello")}); console.log("user_router instantiated"); }; module.exports = UserRouter; 

当我使用节点www开始节点,我得到以下输出,这表明我的类正在实例化。

 C:\NETSHARE\data\devprojects\eclipse\Reckon_Orbs\bin>node www user_router instantiated db_router instantiated Express server listening on port 3000 

我打电话时得到的结果是: http://localhost:3000/db/user/get是一个404错误。 但是,如果我取消注释掉db_router中的注释行并调用http://localhost:3000/db/user ,那么我将得到“hello”作为响应。 这表明第一层embedded式路由器的安装工作正常。

让我来帮助你,你如何能够很好地组织,使一切工作。

你可以有这样的app.js

 var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var config = require('./config/config'); var mongoose = require("mongoose"); var app = express(); var port = process.env.PORT || 3000; app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); // view engine setup, it can be ejs, jade or whatever you like app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.use(logger('dev')); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); var connect = function(){ var options = { server: { socketOptions:{ keepAlive : 1 } } }; mongoose.connect(config.db,options); }; connect(); mongoose.connection.on('error',console.log); mongoose.connection.on('disconnected',connect); require('./config/routes')(app); require('./config/express')(app); module.exports = app; 

configuration/ config.js

 //you can further break your configuration for different environments such as development, production, test, stating etc. var path = require("path"); var extend = require("util")._extend; var development = require("./env/development"); var test = require("./env/test"); var production = require("./env/production"); var defaults = { root: path.normalize(__dirname + '/..') }; module.exports = { development: extend(development,defaults), test: extend(test,defaults), production: extend(production,defaults) }[process.env.NODE_ENV || "development"] 

configuration/ ENV / development.js

 module.exports = { db: 'mongodb://localhost/MeanDemo_dev' }; 

非常整洁你可以组织你的路线。

configuration/ routes.js

 var routes = require('../routes/index'); var users = require('../routes/users'); module.exports = function (app){ app.use('/', routes); app.use('/user',users); } 

在我的情况下,调用最终与MongoDB交互的控制器的路由的例子。 路线/ index.js

 var express = require('express'); var router = express.Router(); var meetupController = require('../app/controllers/MeetupController'); router.post('/meetup',meetupController.create); router.get('/meetup',meetupController.getAll); router.get('/meetup/:id',meetupController.get); router.put('/meetup/:id',meetupController.update); router.delete('/meetup/:id',meetupController.delete); module.exports = router; 

我的项目框架如下所示: 在这里输入图像说明

你可以在这里看看完整的源代码,这是一个很好的例子,如果你还想要Angularjs在前端。 所以这是我如何组织我的代码,它工作得很好。 我希望它也能帮助你。 谢谢。

我解决了这个问题。 如果路由器B尚未安装,则无法将路由器A安装到路由器B. 因此,不要在pathpath中自下而上构build路由器模块,而必须从应用程序开始自上而下地构build路由器模块。 我修改我的代码看起来像下面,它按预期工作。 请注意,我的解决scheme是包含一个function,安装路由器后安装路由器的子路由器。 因此,调用者必须挂载新的路由器,然后调用路由器的executeMount函数,将任何路由器安装在挂接链的下面。 这个解决scheme允许在创build路由器时进行dependency injection,这正是我所需要的。

app.js

 var dbRouterMod = require('./routes/db/db_router.js'); var dbRouterContainer = new dbRouterMod(express,app.get('dbPath'),app.get('dbConnectString')); app.use('/db', dbRouterContainer.router); dbRouterContainer.executeMounts(); 

db_router.js

 var DbRouter = function(express,dbPath,connectString) { this.router = express.Router(); console.log("db_router instantiated"); this.executeMounts = function(){ var userRouterMod = require('./user_router.js'); var userRouterContainer = new userRouterMod(express,dbPath,connectString); this.router.use('/user',userRouterContainer.router); userRouterContainer.executeMounts(); }; }; module.exports = DbRouter; 

user_router.js

 var UserRouter = function(express,dbPath,connectString){ this.router = express.Router(); console.log("user_router instantiated"); this.executeMounts = function(){ this.router.get('/get',function(req,res){res.send("hello")}); }; }; module.exports = UserRouter;