2014-12-04 10 views
1

expressjs를 사용하여 제 1 프로젝트를 진행하고 있으며 장착하지 않은 라우터에 문제가 있습니다. 기본적으로 두 번째 라우터 개체를 탑재해야하는 라우터 개체를 탑재하는 응용 프로그램이 있습니다. 첫 번째 임베디드 라우터는 app.use 명령에 의해 성공적으로 마운트되지만 두 번째 레이어 임베디드 라우터는 첫 번째 임베디드 라우터에 의해 마운트되지 않습니다. 내 접근법이 왜 작동하지 않는지 말해 주려면 나보다 똑똑한 사람이 필요합니다. 모든 도움을 많이 받으실 수 있습니다.Express 라우터가 장착되지 않았습니다.

아래 프로젝트 세부 정보 및 코드를 참조하십시오. 나는 출력 다음 얻을 enter image description here

는 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"를 얻습니다. 이것은 1 층 임베디드 라우터가 잘 작동 함을 의미합니다.

+0

을 app.js 그리고 새로운 인스턴스를 생성하고 속성으로 라우터에 액세스 할 때, 나는 또한 constru보다는 일반적인 함수를 내보내려고했다. ctor를 호출 한 다음 함수가 명시 적으로 라우터를 반환하도록해야합니다. 그런 다음 마운트 된 라우터를 사용합니다. 이것은 동일한 결과를 낳았다. db 라우터는 등록 정보를 탑재하지만 사용자 라우터는 등록 정보를 갖지 않습니다. – rss181919

+0

앱 루트에 마운트되지 않은 라우터에 마운트 할 수 없다는 것이 문제 일까 궁금합니다. 내 예제에서, 사용자 라우터는 db 라우터가 앱 라우터에 마운트되기 전에 db 라우터에 마운트하려고 시도하고 있습니다. 나는 이것을 시험하고 결과를 제공 할 것이다. – rss181919

답변

1

잘 정리하고 모든 것을 작동시키는 방법을 알려 드리겠습니다.

//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"] 

설정은/ENV은/

module.exports = { 
    db: 'mongodb://localhost/MeanDemo_dev' 
}; 
을 development.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; 

설정/config.js : 당신은 을 가질 수

같은 것을 app.js

경로를 매우 정교하게 구성 할 수 있습니다.

설정/routes.js 결국 내 경우에는 MongoDB를와 상호 작용 컨트롤러를 호출 경로

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

예. 당신이 더에 AngularJS와이하려는 경우가 전체 소스 코드 here 좀 걸릴 수 있습니다 enter image description here

는, 그것은 좋은 예입니다 : 같은 루트 /하는 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; 

내 프로젝트의 골격이 보인다 프런트 엔드. 그래서 내 코드를 구성하는 방법이며 잘 작동합니다. 나는 그것이 당신을 도울 것이라는 것을 희망한다. 감사.

+0

프로젝트를 구조화하기위한 멋진 솔루션을 제게 제공했습니다. 이는 기술에 익숙하지 않은 나 같은 사람에게 도움이됩니다. 그러나, 내가 정말로 찾고 있던 것은 내 임베디드 라우터가 장착되지 않는 이유에 대한 해답이었습니다. 내가 명시 적 문서를 읽었을 때, 필자는 필요하다면 여러 층의 라우터를 탑재 할 수 있어야하며 어떻게 작동하는지 알고 싶다. 그렇게하는 법을 저에게 말할 수 있다면, 저는 이것을 답으로 표시 할 것입니다. – rss181919

+0

Expressj는 매우 구성 가능하며 프로젝트를 구조화하는 데는 여러 가지 방법이 있습니다. Express에서 기본 연결 미들웨어 개념을 이해할 수 있다면 쉽게 파악할 수 있습니다. 솔루션 당신이 직면 한 문제를 피하기 위해 프로젝트 구조를 수정하는 것이 었습니다. 여전히 프로젝트가 혼란스럽고 관리하기 어려운 상태가되기를 원한다면 선택하십시오. dbRouterMod (..)에 매개 변수로 db config를 전달할 이유가 없습니다. 마찬가지로, 컨트롤러 계층을 경로에 추가 할 수도 있습니다. 따라서 myside의 제안 사항 중 일부입니다. 행복한 코딩. – NarendraSoni

1

문제점을 파악했습니다.라우터 B가 아직 마운트되어 있지 않으면 라우터 A를 라우터 B에 장착 할 수 없습니다. 따라서 경로 경로에서 라우터 모듈을 아래쪽으로 빌드하는 대신 앱에서 시작하여 위에서 아래로 빌드해야합니다. 다음과 같이 코드를 수정했으며 예상대로 작동합니다. 내 솔루션은 라우터가 마운트 된 후 라우터의 서브 라우터를 탑재하는 기능을 포함하는 것입니다. 따라서 호출자는 새 라우터를 마운트 한 다음 라우터의 executeMount 함수를 호출하여 모든 라우터를 마운트 체인 아래로 탑재해야합니다. 이 솔루션은 내가 찾고있는 라우터 생성 중 종속성 주입을 허용합니다. 당신이 클래스에 대한 참조를 가져 곳

는 위에 나열된 클래스 접근 방식을 사용하여

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; 
관련 문제