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 回复

根据你提供的代码,问题可能出在路由处理和中间件的配置上。让我们逐步分析并提供解决方案。

问题分析

  1. 路由配置

    • 你的路由配置中定义了//home/login等路径。
    • site.indexsite.home 这些路由处理函数可能没有正确实现或返回正确的响应。
  2. 中间件配置

    • 你在中间件中设置了路径拦截逻辑,确保未登录用户访问非/login路径时重定向到/login
    • 该中间件应该放在路由之前,以确保它能捕获所有请求。
  3. 请求处理

    • 确保你的site控制器中的indexhome函数正确实现了返回视图或重定向逻辑。

解决方案

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') 的执行上。请确保以下几点:

  1. 检查请求路径是否正确:确保请求路径与路由中的路径匹配。
  2. 检查中间件顺序:确保中间件在请求处理之前被执行。
  3. 确保 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') 的执行。如果仍然无法跳转,请检查控制台日志和网络请求,以确定具体问题所在。

回到顶部