Node.js 向node express添加新路由
我正在尝试在我的express应用程序中添加新路由,但在尝试启动服务器时不断出错。错误是Node.js 向node express添加新路由,node.js,routing,express,Node.js,Routing,Express,我正在尝试在我的express应用程序中添加新路由,但在尝试启动服务器时不断出错。错误是 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] 这是我的文件,我是node的新手,所
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]
这是我的文件,我是node的新手,所以如果我遗漏了一个重要文件,请告诉我
routes/furniture.js
exports.furniture = function(req, res){
res.render('furniture', { title: '4\267pli' });
};
routes/index.js
/*
* GET home page.
*/
exports.index = function(req, res){
res.render('index', { title: '4\267pli' });
};
视图/家具.ejs
<!DOCTYPE html>
<html>
<head>
<title>4·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>
问题是:
routes = require('./routes'),
user = require('./routes/user'),
furniture = require('./routes/furniture'),
这3个是设置路由文件夹,而不是特定文件,express将查找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
/**
* 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'));
});
// 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' });
});
}
require("./routes/furniture")(app);
然后在app.js
中:
module.exports = function(app)
{
app.get("/furniture/", function(req, res) {
res.render('furniture', { title: '4\267plieee' });
});
}
require("./routes/furniture")(app);
它基本上是一样的,但是app.js会更干净。虽然这有点旧,但是分享我这样做的方式。下面是另一种方法,它使代码更干净,更容易添加路由 app.js
const app = express();
const routes = require('./routes');
app.use('/api', routes); //Main entry point
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;
module.exports = {
createUser:function(req,res,next){
},
updateUser:function(req,res,next){
},
deleteUser:function(req,res,next){
}
}
module.exports = {
getDashboard:function(req,res,next){
}
}
/routes/index.js
const app = express();
const routes = require('./routes');
app.use('/api', routes); //Main entry point
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;
module.exports = {
createUser:function(req,res,next){
},
updateUser:function(req,res,next){
},
deleteUser:function(req,res,next){
}
}
module.exports = {
getDashboard:function(req,res,next){
}
}
“validateUser”和“validateAdmin”是定制的中间件,用于在请求到达实际请求处理程序之前验证请求参数或进行一些预处理。这是可选的,您也可以有多个中间件(逗号分隔)
/routes/user.js
const app = express();
const routes = require('./routes');
app.use('/api', routes); //Main entry point
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;
module.exports = {
createUser:function(req,res,next){
},
updateUser:function(req,res,next){
},
deleteUser:function(req,res,next){
}
}
module.exports = {
getDashboard:function(req,res,next){
}
}
/routes/admin.js
const app = express();
const routes = require('./routes');
app.use('/api', routes); //Main entry point
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;
module.exports = {
createUser:function(req,res,next){
},
updateUser:function(req,res,next){
},
deleteUser:function(req,res,next){
}
}
module.exports = {
getDashboard:function(req,res,next){
}
}
遵循简单一致的文件夹结构,然后使用模块自动完成所有工作。
那就永远不要回头。把节省下来的时间花在其他重要的事情上
TL;博士
就这样
更多信息:
你会怎么做?让我们从文件结构开始:
在app.js中
在任何路由文件中:
例如,index.js
const router=require('express')。router()
router.get('/',(req,res)=>{…})
get('/something other',(req,res)=>{…})
或者a-file-that-doesnt-share-same-name-with-other-folder.js
通常,您可能需要启动一个文件夹并使用index.js
图案但如果是一个小文件,也没关系
const router=require('express')。router()
const dir='a-file-that-do-not-have-other-folder-with-same-name'//您可以使用它来缩短,但它是可选的。
get(`$(dir)/`,(req,res)=>{…})
get(`$(dir)/嵌套路由`,(req,res)=>{…})
免责声明:我写的包。但事实上,它已经过期很久了,它已经达到了我的极限,只能等待别人来编写它。@3boll如果你想在用户界面下有几个函数呢。。。index.js admin.js和foo.js。。。你会怎么写呢?似乎user=require('./routes/user')也可能与routes文件夹中保存的user.js文件相关。噢,亲爱的,这是个坏主意@Cmag和1dolinski说,但它有这么多批准。这绝对是一个好方法,因为它实际上将HTTP路由本身保存在routes文件夹中。