2013-05-14 10 views
14

エクスプレスアプリで新しいルートを追加しようとしていますが、サーバーを起動しようとするとエラーが発生します。エラーがここにノードエクスプレスに新しいルートを追加する

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] 

は、私はので、私は

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

ルート/ furniture.js

ルートを/重要なファイルを残した場合、私に知らせてノードに新しいよ、私のファイルであるさindex.js

furniture.ejs

/* 
* GET home page. 
*/ 

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

ビュー/

<!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> 

app.js

/** 
* 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

悩みです:

routes = require('./routes'), 
user = require('./routes/user'), 
furniture = require('./routes/furniture'), 

これら3が見つからない(index.jsを探します、あなたのルートフォルダではなく、特定のファイルを表現設定しています、そして - >エラー)これらのフォルダ内

、あなたとindex.jsを置く必要があります。

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

続いて、プロジェクトフォルダ構造は次のようになります。

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とfoo.js ...あなたはどうやってそれを書いていますか? – Cmag

+1

@Clustermagnetはレスポンスに追加されたコードをチェックします。 – jmingov

6

あなたのウェブサイトは、いくつかの時間が私のような何かをすることを好むので、大きい場合:

routes/furniture.js

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

そして:

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

それは主に同じですが、アプリのですが。 jsはよりクリーンになります。

+0

これは間もなく役に立ちます。 –

+1

これは間違いなく、実際にはルートフォルダ内にHTTPルート自体を保持するので、いい方法です。 –

2

これはやや古いですが、やり方を分かち合いましたが、私はこれをやっています。コードをよりクリーンで簡単にルートを追加できるようにする別の方法があります。

app.js

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

/ルート/インデックス。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){ 

    } 
} 
関連する問題