Nodejs express4初学时路由的一点疑问,修改代码后,只到“/”对应的页面
Nodejs express4初学时路由的一点疑问,修改代码后,只到“/”对应的页面
环境:node - v0.10.29,npm-1.4.14,express-4.2.0 通过命令创建了ejs模版的工程:express -e ejs helloworld
原始代码:
app.js:
var index = require('./routes/index');
var users = require('./routes/users');
app.use('/', routes);
app.use('/users', users);
index.js
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
res.render('index', { title: 'Express' });
});
module.exports = router;
user.js
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
res.send('respond with a resource');
});
module.exports = router;
使用http://localhost:18080/,http://localhost:18080/users 分别进入不同的页面。
后面自己修改了代码,修改后关键地方如下:
app.js:
var index = require('./routes/index');
var users = require('./routes/users');
app.use('/', index.index);
app.use('/users', users.users);
index.js
exports.index = function(req, res){
res.render('index', { title: 'Express v2' +content });
//next();
}
users.js
exports.users = function (req, res) {
console.log(req.session.name);
res.render('queryPassword', { url:"http://www.baidu.com", userName: "chenshengli532", password: "aaaaa8888"});
}
不管使用哪个地址:http://localhost:18080 http://localhost:18080/users,结果都是到了"/"页面。
大家帮忙看下怎么回事,是不是第二种index.js|users.js的写法有问题,还是怎么回事,谢谢。
根据你描述的情况,问题出在路由定义的方式上。在 Express 4.x 中,路由应该以中间件的形式来定义,而不是直接调用函数。你之前的代码将路由定义为中间件,并且正确地挂载了这些中间件。但是你在修改后的代码中尝试直接调用这些路由函数,这导致了所有请求都被定向到了根路径。
原始代码(正确)
在原始代码中,你使用的是标准的路由中间件方式:
app.js:
var index = require('./routes/index');
var users = require('./routes/users');
// 正确挂载路由中间件
app.use('/', index); // 这里传递的是整个路由对象
app.use('/users', users);
index.js:
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
res.render('index', { title: 'Express' });
});
module.exports = router; // 导出路由对象
users.js:
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
res.send('respond with a resource');
});
module.exports = router; // 导出路由对象
修改后的代码(错误)
在你的修改后的代码中,你试图直接调用路由处理函数,这会导致所有请求都指向根路径。
app.js:
var index = require('./routes/index');
var users = require('./routes/users');
// 错误的路由定义方式
app.use('/', index.index); // 这里传递的是函数,而不是路由中间件
app.use('/users', users.users);
index.js:
exports.index = function(req, res){
res.render('index', { title: 'Express v2' + content });
};
users.js:
exports.users = function (req, res) {
console.log(req.session.name);
res.render('queryPassword', { url: "http://www.baidu.com", userName: "chenshengli532", password: "aaaaa8888" });
};
解决方案
你应该保持使用路由中间件的方式,而不是直接调用路由处理函数。这样可以确保每个路由都能被正确处理。
app.js:
var index = require('./routes/index');
var users = require('./routes/users');
// 正确挂载路由中间件
app.use('/', index); // 传递的是整个路由对象
app.use('/users', users);
index.js:
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
res.render('index', { title: 'Express v2' });
});
module.exports = router; // 导出路由对象
users.js:
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
console.log(req.session.name);
res.render('queryPassword', { url: "http://www.baidu.com", userName: "chenshengli532", password: "aaaaa8888" });
});
module.exports = router; // 导出路由对象
通过这种方式,你可以确保所有路由都能被正确处理。
我在修改后的代码里面,将app.js中路由顺序调整了一下,也能进入不同的界面,但感觉比较二。 app.js
app.use('/users', users.users);
app.use('/', index.index);
你这种写法var router = express.Router();必用 app.use 只是相当于启用 首先USE到index.js
直接res.render()出去了 res.render 内存在一个res.end res.end之后就不能第二次render ‘/user’ 了
var express = require(‘express’); var router = express.Router();
exports.index = function(req, res){ router.get(’/’, function(req, res) { res.send(‘respond with a resource’); }); }
exports.users = function (req, res) { router.get(’/user’, function(req, res) { console.log(req.session.name); res.render(‘queryPassword’, { url:“http://www.baidu.com”, userName: “chenshengli532”, password: “aaaaa8888”}); }) }
router.get(x,next)
相当于
x == req.url ?next(); :{}
像上面那样写,页面一直在请求但无相应,后面在网上查了相关资料,找到另外一种写法。
基本上,后期网站有很多路由的话,路由定义在各自的routes模块中,app.js也不会有太多的代码。不知道是否还有其他更简便的写法。 app.js
var app = express();
var index = require('./routes/index');
var users = require('./routes/users');
index(app);
users(app);
index.js
module.exports = function (app) {
app.get('/', function (req, res) {
res.render('index', { title: 'Express' });
});
app.get('/test', function (req, res) {
console.log(req.session.name);
res.render('queryPassword', { url: "http://www.baidu.com", userName: "chenshengli532", password: "aaaaa8888"});
});
}
users.js
module.exports = function (app) {
app.get('/users', function(req, res) {
console.log(req.session.name);
res.render('queryPassword', { url: "http://www.baidu.com", userName: "chenshengli532", password: "aaaaa8888"});
});
}
不知道为什么我这些定义了,页面一直在请求但无服务器无响应。
user.js可以去掉。你没看懂我写法
莫非全写在app.js里面。 大一点的项目有很多路由,app.js不会爆掉么?
app.use('/users', users);
请教一下 这个代码是为了实现什么?能理解为 后台系统的 入口?那在users.js该怎么写路由规则呢?
router.get('/users/username/001',function(req,res){
res.send('user: ' + req.params.username);
});
这样写页面该怎么命名?
从你的描述来看,问题在于你在app.js
中修改了路由的方式,导致所有路径都指向了根路径的处理函数。这是因为你在app.use
中直接指定了处理函数,而不是将整个路由器对象挂载上去。
示例代码
app.js
var express = require('express');
var index = require('./routes/index');
var users = require('./routes/users');
// 使用路由器对象,而不是直接指定处理函数
app.use('/', index); // 这里使用的是路由器对象
app.use('/users', users); // 这里也是
index.js
var express = require('express');
var router = express.Router();
// 直接定义路由
router.get('/', function(req, res) {
res.render('index', { title: 'Express v2' });
});
module.exports = router;
users.js
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
console.log(req.session.name);
res.render('queryPassword', {
url: "http://www.baidu.com",
userName: "chenshengli532",
password: "aaaaa8888"
});
});
module.exports = router;
解释
app.use('/', index)
和app.use('/users', users)
中的index
和users
是路由器对象。- 路由器对象会自动处理路径前缀(如
'/'
或'/users'
),所以不需要再在每个路由中添加前缀。 - 在
index.js
和users.js
中,你可以直接定义路由,而不需要手动指定路径前缀。
这样修改后,/
会调用 index.js
中定义的路由,/users
会调用 users.js
中定义的路由。