2013-05-14 2 views
14

익스프레스 앱에 새 경로를 추가하려고하는데 서버를 시작하려고 할 때 오류가 계속 발생합니다. 오류가/내가 그렇게 노드 i가 중요한 파일노드 익스프레스에 새 경로 추가하기

경로를 알아두면 나에게 알려 새로운 해요, 여기

C:\development\node\express_app\node_modules\express\lib\router\index.js:252 
    throw new Error(msg); 
     ^
Error: .get() requires callback functions but got a [object Undefined] 

내 파일입니다입니다 furniture.js

exports.furniture = function(req, res){ 
    res.render('furniture', { title: '4\267pli' }); 
}; 

루트/

/* 
* GET home page. 
*/ 

exports.index = function(req, res){ 
    res.render('index', { title: '4\267pli' }); 
}; 

전망하는 index.js/

을 furniture.ejs

는이 3 귀하의 루트 폴더가 아닌 특정 파일을 설정하는
routes = require('./routes'), 
user = require('./routes/user'), 
furniture = require('./routes/furniture'), 

하는하는 index.js를 찾습니다 표현 (찾을 수 없음 :

<!DOCTYPE html> 
<html> 
<head> 
    <title>4&middot;pli -- architecture</title> 
    <link rel='stylesheet' href='/stylesheets/style.css'/> 
    <link href='http://fonts.googleapis.com/css?family=Didact+Gothic' rel='stylesheet' type='text/css'> 
</head> 
<body> 
<div class="wrapper"> 
    <h1 class="logo"><%= title %></h1> 
</div> 
</body> 
</html> 

는 문제가

/** 
* Module dependencies. 
*/ 

var express = require('express') 
    , routes = require('./routes') 
    , user = require('./routes/user') 
    , furniture = require('./routes/furniture') 
    , http = require('http') 
    , path = require('path'); 

var app = express(); 

// all environments 
app.set('port', process.env.PORT || 3000); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'ejs'); 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(app.router); 
    app.use(require('stylus').middleware(__dirname + '/public')); 
app.use(express.static(path.join(__dirname, 'public'))); 

// development only 
if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 

app.get('/', routes.index); 
app.get('/users', user.list); 
app.get('/furniture', routes.furniture); 

http.createServer(app).listen(app.get('port'), function(){ 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

답변

24

을 app.js , then -> error)

이러한 폴더 안에는 다음과 함께 index.js를 넣어야합니다.

당신은 다음과 같은 경로에 여러 내보내기 기능을 추가 할 수 있습니다

routes/ 
    ├── index.js 
    │ 
    ├── user/ 
    │  └── index.js (with a exports.user inside) 
    │ 
    └── fourniture/ 
     └── index.js (with a exports.furniture inside) 

: 같은

그런 다음 프로젝트 폴더 구조가 보일 것입니다

는 app.js

// a folder called routes with the index.js file inside 
routes = require('./routes') 

. 
. 
. 

app.get('/', routes.main_function); 
app.get('/sec_route', routes.sec_function); 
app.post('/other_route', routes.other_function); 

/routes/index.js

exports.main_function = function(req, res){ 
    res.render('template1', { foo: foo }); 
}; 

exports.sec_function = function(req, res){ 
    res.render('template2', { bar: bar }); 
}; 

exports.other_function = function(req, res){ 
    res.render('template1', { baz: baz }); 
}; 
+0

덕분에 좋은 작품 /routes/user.js –

+0

@ 3boll 당신이 사용자에 따라 여러 가지 기능을 가지고 싶어합니다. .. index.js admin.js and foo.js ... 어떻게 쓸 것입니까? – Cmag

+1

@Clustermagnet 응답에 추가 된 코드를 확인하십시오. – jmingov

6

당신의 웹 사이트가 나는 같은 것을 할 선호 몇 번 너무 큰 경우

routes/furniture.js :

module.exports = function(app) 
{ 
    app.get("/furniture/", function(req, res) { 
     res.render('furniture', { title: '4\267plieee' }); 
    }); 
} 

그리고 app.js에서 :

require("./routes/furniture")(app); 

그것은 주로 동일하지만, 응용 프로그램의합니다. js가 더 깨끗해질 것입니다.

+0

에 보관 된 user.js 파일과 관련 될 수 있다고 생각합니다. 덕분에 조만간 유용 할 것입니다. –

+1

이것은 실제로 경로 폴더 내에 HTTP 경로 자체를 유지하므로 좋은 방법입니다. –

2

비록 이것이 다소 길지만 공유 방법은 있지만 이렇게합니다. 코드를 더 깨끗하고 쉽게 추가 할 수있는 또 다른 방법이 있습니다.

const app = express(); 
const routes = require('./routes'); 
app.use('/api', routes); //Main entry point 

/경로/인덱스를 app.js.JS

const router = require('express').Router(); 
const user = require('./user'); 
const admin = require('./admin'); 

//This is a simple route 
router.get('/health-check', (req, res) => 
    res.send('OK') 
); 

router.route('/users') 
     .post(validate, user.createUser); 

router.route('/users/:userId') 
     .get(validateUser, user.getUser) 
     .patch(validateUser, user.updateUser) 
     .delete(validateUser, user.deleteUser); 

router.route('/admins/:adminId/dashboard') 
     .get(validateAdmin,admin.getDashboard); 

module.exports = router; 

'validateUser'및 'validateAdmin'는 사용자 요청 파라미터를 검증하거나 요청 실제 의뢰처에 도달하기 전에 약간의 예비 처리를 수행하는 데 사용되는 중간 상품이다. 이것은 선택 사항이며 여러 개의 미들웨어 (쉼표로 구분)를 사용할 수도 있습니다.

module.exports = { 
    createUser:function(req,res,next){ 

    }, 
    updateUser:function(req,res,next){ 

    }, 
    deleteUser:function(req,res,next){ 

    } 
} 

/routes/admin.js

module.exports = { 
    getDashboard:function(req,res,next){ 

    } 
}