Javascript req.user未定义,但登录正常

Javascript req.user未定义,但登录正常,javascript,mysql,node.js,express,passport.js,Javascript,Mysql,Node.js,Express,Passport.js,背景 我知道这个问题已经被问了一百万次了,但是没有一个问题能解决我的问题。在我的应用程序路由中,无论我访问哪个路由,调用req.user只会返回未定义的 如果这有帮助的话,我的登录功能也可以正常工作。当登录/未登录时,我的客户端的特定元素会发生更改,但req.user返回未定义 正如许多人针对类似问题指出的那样,这可能是我的中间件排序中的一个失误,但我一生都找不到它,因为我的排序实际上是从大约3个不同的地方复制/粘贴的 我的应用程序的总体布局是一个主文件app.js,用于设置我的express应

背景

我知道这个问题已经被问了一百万次了,但是没有一个问题能解决我的问题。在我的应用程序路由中,无论我访问哪个路由,调用req.user只会返回未定义的

如果这有帮助的话,我的登录功能也可以正常工作。当登录/未登录时,我的客户端的特定元素会发生更改,但req.user返回未定义

正如许多人针对类似问题指出的那样,这可能是我的中间件排序中的一个失误,但我一生都找不到它,因为我的排序实际上是从大约3个不同的地方复制/粘贴的

我的应用程序的总体布局是一个主文件app.js,用于设置我的express应用程序并包含我的所有路线。我的所有路由都位于我的中间件设置之下。


相关app.js代码

// Middleware
// Setup DB Pool and app
var pool = mysql.createPool(db.pool);
var app  = express();

// Setup Handlebars
app.engine('handlebars', exprhbr({defaultLayout: 'index'}));
app.set('view engine', 'handlebars');
app.use(express.static('public'));

// Setup body parser
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// Setup session
app.use(session({
    cookie: { maxAge: 60000 },
    secret: 'spooky',
    resave: true,
    saveUninitialized: true
}));

// Setup passport
app.use(passport.initialize());
app.use(passport.session());
var strategy = require('passport-local').Strategy;
var bcrypt   = require('bcrypt');
var mysql    = require('mysql');
var db       = require('./database');
var pool     = mysql.createPool(db.pool);

module.exports = (passport) => {
    passport.serializeUser((user, done) => {
        done(null, user.uid);
    });

    passport.deserializeUser((uid, done) => {
        pool.query('SELECT * FROM User WHERE (user_id = ?)', [uid], (err, result) => {
            done(err, {uid: result[0].user_id, username: result[0].username, pass: result[0].password});
        });
    });

    // Setup Passport
    passport.use(new strategy({ usernameField: 'username' }, (username, pass, done) => {
        // Match a user
        pool.query('SELECT * FROM User Where (username = ?)', [username], (err, result) => {
            if (!result.length) return done(null, false, {message: 'Username isn\'t registered'});
            let user = result[0];

            // User was found so decrpt pass
            bcrypt.compare(pass, user.password, (err, isMatch) => {
                if (err) throw err;

                // User matches
                if (isMatch)
                    return done(null, {uid: user.user_id, username: username, pass: user.password});
                else
                    done(null, false, {message: 'Password doesn\'t match'})
            });
        });
    }));
}


护照

我使用以下命令初始化passport:

require('./src/passport')(passport);
在我的文件顶部,上面说的passport文件如下所示:


相关passport.js代码

// Middleware
// Setup DB Pool and app
var pool = mysql.createPool(db.pool);
var app  = express();

// Setup Handlebars
app.engine('handlebars', exprhbr({defaultLayout: 'index'}));
app.set('view engine', 'handlebars');
app.use(express.static('public'));

// Setup body parser
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// Setup session
app.use(session({
    cookie: { maxAge: 60000 },
    secret: 'spooky',
    resave: true,
    saveUninitialized: true
}));

// Setup passport
app.use(passport.initialize());
app.use(passport.session());
var strategy = require('passport-local').Strategy;
var bcrypt   = require('bcrypt');
var mysql    = require('mysql');
var db       = require('./database');
var pool     = mysql.createPool(db.pool);

module.exports = (passport) => {
    passport.serializeUser((user, done) => {
        done(null, user.uid);
    });

    passport.deserializeUser((uid, done) => {
        pool.query('SELECT * FROM User WHERE (user_id = ?)', [uid], (err, result) => {
            done(err, {uid: result[0].user_id, username: result[0].username, pass: result[0].password});
        });
    });

    // Setup Passport
    passport.use(new strategy({ usernameField: 'username' }, (username, pass, done) => {
        // Match a user
        pool.query('SELECT * FROM User Where (username = ?)', [username], (err, result) => {
            if (!result.length) return done(null, false, {message: 'Username isn\'t registered'});
            let user = result[0];

            // User was found so decrpt pass
            bcrypt.compare(pass, user.password, (err, isMatch) => {
                if (err) throw err;

                // User matches
                if (isMatch)
                    return done(null, {uid: user.user_id, username: username, pass: user.password});
                else
                    done(null, false, {message: 'Password doesn\'t match'})
            });
        });
    }));
}


交换函数声明的顺序没有任何帮助


感谢您花时间阅读这篇长篇文章,并尽可能地帮助我

就目前情况而言,我的站点在页面刷新几次后将您注销,而大多数时候,我没有注意到这种情况发生

我的问题出现是因为我正在检查req.user以查找未登录的用户,因此它返回的唯一逻辑内容是未定义的。因为我没有注意到我已注销,所以我假设无论用户是否登录,它都未定义


我解决了这个问题,首先通过检查req.user是否存在来确认是否存在登录用户,然后相应地设置变量。

目前的情况是,我的站点在刷新几页后将您注销,大多数情况下,我没有注意到这种情况

我的问题出现是因为我正在检查req.user以查找未登录的用户,因此它返回的唯一逻辑内容是未定义的。因为我没有注意到我已注销,所以我假设无论用户是否登录,它都未定义


我解决了这个问题,首先通过检查req.user是否存在来确认登录用户的存在,然后相应地设置变量。

passport.authenticate()的调用在哪里?如果您阅读了文档,它清楚地指出这是一种要求,需要将某些东西作为经过身份验证的路由:您是否设置了中间件?我更新了我的帖子,以包括我的登录路由,其中包含对passport.authenticate()的调用。我所读到的和看到的示例使我认为我只需要对用户登录进行一次调用,然后我就可以在各种其他路由上使用req.user来获取连接用户信息。我的假设是错误的,实际上需要在每个路由上调用authenticate,还是我不理解您的问题?我只是运行了您的代码。首先,登录请求在我身上无法正常工作,并重定向到登录页面。然后我意识到策略上没有密码字段。我添加了密码字段。登录成功并重定向到用户页面。然后我调用GET“/”路径。它的工作非常完美,用户可以使用。我不明白为什么登录请求对您有效而对我无效。您对
passport.authenticate()
的调用在哪里?如果您阅读了文档,它清楚地指出这是一种要求,需要将某些东西作为经过身份验证的路由:您是否设置了中间件?我更新了我的帖子,以包括我的登录路由,其中包含对passport.authenticate()的调用。我所读到的和看到的示例使我认为我只需要对用户登录进行一次调用,然后我就可以在各种其他路由上使用req.user来获取连接用户信息。我的假设是错误的,实际上需要在每个路由上调用authenticate,还是我不理解您的问题?我只是运行了您的代码。首先,登录请求在我身上无法正常工作,并重定向到登录页面。然后我意识到策略上没有密码字段。我添加了密码字段。登录成功并重定向到用户页面。然后我调用GET“/”路径。它的工作非常完美,用户可以使用。我不明白为什么登录请求对你有效而对我无效。你看过我的评论了吗?除了一个问题外,您的博文代码对我和打印用户有效!。我做到了,甚至尝试了你的建议。我在登录之外的任何地方都不使用密码字段,而且在创建策略时似乎没有该字段。老实说,我不知道这种不一致性从何而来,但最终都解决了,所以谁在乎呢!不管怎样,谢谢你的帮助;非常感谢。你看过我的评论了吗?除了一个问题外,您的博文代码对我和打印用户有效!。我做到了,甚至尝试了你的建议。我在登录之外的任何地方都不使用密码字段,而且在创建策略时似乎没有该字段。老实说,我不知道这种不一致性从何而来,但最终都解决了,所以谁在乎呢!不管怎样,谢谢你的帮助;非常感谢。