增加一个新的路由到节点expression

我试图在快速应用程序中添加新路线,但在尝试启动服务器时出现错误。 错误是

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' }); }; 

路线/ index.js

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

意见/ furniture.ejs

 <!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')); }); 

麻烦是:

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

这三个是设置你的路由文件夹,而不是一个特定的文件,expression会寻找一个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 }); }; 

如果您的网站如此之大,我更喜欢做一些类似的事情:

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); 

它主要是一样的,但是app.js会更干净。

虽然这是有点旧,虽然分享我这样做的方式。 这是另一种使代码更加清晰和易于添加路由的方法。

app.js

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

/routes/index.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'是自定义的中间件,它将被用来validation请求参数或者在请求到达实际的请求处理器之前做一些预处理。 这是可选的,你也可以有多个中间件(逗号分隔)。

/routes/user.js

 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){ } }