Nodejs 求助:express为什么无法跳转
Nodejs 求助:express为什么无法跳转
我想先尝试访问网站时时跳转到login,然后就这么写
var express = require('express'),
routes = require('./routes'),
http = require('http'),
path = require('path'),
fs = require('fs'),
juicer = require('juicer'),
config = require('./config').config;
var app = express();
var staticDir = path.join(__dirname, 'public');
app.configure(function () {
app.set('port', config.port || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'html');
app.engine('html', function (path, options, fn) {//利用juicer作为模板引擎
fs.readFile(path, 'utf8', function (err, str) {
if (err)
return fn(err);
str = juicer(str, options);
fn(null, str);
});
});
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.cookieParser());//开启cookie
app.use(express.session({//开启session
secret: config.session_secret
}));
});
routes(app);
app.use(function (req, res, next) {
var url = req.originalUrl;
console.log(url);
if (url != "/login" && !req.session.user) {//拦截
res.redirect('/login')
console.log(1)
}
next();
});
app.configure('development', function () {
app.use(express.errorHandler());
});
app.configure('production', function () {
app.use(express.static(staticDir, { maxAge: 3600000 * 24 * 30 }));//静态文件支持加缓存
app.use(express.errorHandler());
app.set('view cache', true);
});
http.createServer(app).listen(app.get('port'), function () {
console.log("Express server listening on port " + app.get('port'));
});
然后router是
var site = require('../controller/site');
module.exports = function(app){
app.get('/', site.index);
app.get('/home', site.home);
app.get('/login', site.showLogin);
//app.post('/login', site.login);
}
直接访问login是可以访问的,但是为什么访问主页,或者任意一个页面跳转不到login呢
4 回复
根据你提供的代码,问题可能出在路由处理和中间件的配置上。让我们逐步分析并提供解决方案。
问题分析
-
路由配置:
- 你的路由配置中定义了
/
、/home
、/login
等路径。 site.index
和site.home
这些路由处理函数可能没有正确实现或返回正确的响应。
- 你的路由配置中定义了
-
中间件配置:
- 你在中间件中设置了路径拦截逻辑,确保未登录用户访问非
/login
路径时重定向到/login
。 - 该中间件应该放在路由之前,以确保它能捕获所有请求。
- 你在中间件中设置了路径拦截逻辑,确保未登录用户访问非
-
请求处理:
- 确保你的
site
控制器中的index
和home
函数正确实现了返回视图或重定向逻辑。
- 确保你的
解决方案
1. 调整中间件顺序
确保中间件在路由之前被调用:
var express = require('express'),
routes = require('./routes'),
http = require('http'),
path = require('path'),
fs = require('fs'),
juicer = require('juicer'),
config = require('./config').config;
var app = express();
var staticDir = path.join(__dirname, 'public');
app.set('port', config.port || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'html');
app.engine('html', function (path, options, fn) {
fs.readFile(path, 'utf8', function (err, str) {
if (err)
return fn(err);
str = juicer(str, options);
fn(null, str);
});
});
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({
secret: config.session_secret
}));
app.use(function (req, res, next) {
var url = req.originalUrl;
console.log(url);
if (url !== "/login" && !req.session.user) {
res.redirect('/login');
console.log(1);
}
next();
});
routes(app);
app.configure('development', function () {
app.use(express.errorHandler());
});
app.configure('production', function () {
app.use(express.static(staticDir, { maxAge: 3600000 * 24 * 30 }));
app.use(express.errorHandler());
app.set('view cache', true);
});
http.createServer(app).listen(app.get('port'), function () {
console.log("Express server listening on port " + app.get('port'));
});
2. 确保路由正确实现
确保你的site
控制器中的路由处理函数能够正确返回视图或重定向:
// controller/site.js
exports.index = function(req, res) {
if (req.session.user) {
res.render('index'); // 渲染主页视图
} else {
res.redirect('/login'); // 如果未登录,重定向到登录页
}
};
exports.home = function(req, res) {
if (req.session.user) {
res.render('home'); // 渲染 home 视图
} else {
res.redirect('/login'); // 如果未登录,重定向到登录页
}
};
exports.showLogin = function(req, res) {
res.render('login'); // 渲染登录页视图
};
总结
通过调整中间件顺序并确保路由处理函数正确实现,可以解决你遇到的问题。希望这些调整能帮助你解决问题。
已经解决了,抱歉
根据你的描述,问题可能出在 res.redirect('/login')
的执行上。请确保以下几点:
- 检查请求路径是否正确:确保请求路径与路由中的路径匹配。
- 检查中间件顺序:确保中间件在请求处理之前被执行。
- 确保 session 已正确配置:确保 session 已正确设置并存储用户信息。
示例代码
假设 site.js
中的控制器函数如下:
exports.index = function(req, res) {
res.send('Welcome to the homepage!');
};
exports.home = function(req, res) {
res.send('Welcome to the home page!');
};
exports.showLogin = function(req, res) {
res.send('<form action="/login" method="post"><input type="text" name="username" /><input type="password" name="password" /><button type="submit">Login</button></form>');
};
路由配置
确保路由配置文件正确引用了这些控制器函数:
var site = require('../controller/site');
module.exports = function(app){
app.get('/', site.index);
app.get('/home', site.home);
app.get('/login', site.showLogin);
//app.post('/login', site.login);
}
中间件
确保中间件能够正确拦截未登录的请求,并重定向到登录页:
app.use(function (req, res, next) {
var url = req.originalUrl;
console.log(url);
if (url !== "/login" && !req.session.user) { // 拦截
res.redirect('/login');
console.log('Redirecting to /login');
}
next();
});
控制器函数
确保登录逻辑正确处理请求,并设置 req.session.user
:
exports.login = function(req, res) {
// 假设用户名和密码正确
req.session.user = { username: 'test' };
res.redirect('/');
};
总结
确保所有中间件和路由配置正确,特别是 res.redirect('/login')
的执行。如果仍然无法跳转,请检查控制台日志和网络请求,以确定具体问题所在。