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的写法有问题,还是怎么回事,谢谢。


11 回复

根据你描述的情况,问题出在路由定义的方式上。在 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) 中的 indexusers 是路由器对象。
  • 路由器对象会自动处理路径前缀(如 '/''/users'),所以不需要再在每个路由中添加前缀。
  • index.jsusers.js 中,你可以直接定义路由,而不需要手动指定路径前缀。

这样修改后,/ 会调用 index.js 中定义的路由,/users 会调用 users.js 中定义的路由。

回到顶部