5

这是一个奇怪的问题。Im Passport 的“本地策略”适用于我的快递应用程序,我遇到了一个奇怪的问题。

基本上,我有三个路线。每个人都有一个身份验证检查。

app.get('/admin', authenticatedOrNot, adminRoute.index);
app.get('/admin/new', authenticatedOrNot, adminRoute.newpost);
app.post('/admin/new', authenticatedOrNot, adminRoute.create);

authenticatedOrNot 方法很简单:

var authenticatedOrNot = function(req, res, next){
    if(req.isAuthenticated()){
        next();
    }else{
        res.redirect("/login");
    }
}

非常适合登录到管理区域并检查用户是否已登录,但是当我将表单提交到“/admin/new”发布路线时,浏览器会挂起。控制台中什么也没有发生,即使使用了 console.log :

exports.create = function(req, res){
    console.log(req);
        // Database logic here
        res.redirect('/admin');
}

我似乎无法让它工作。它只是挂起,并最终失败。浏览器控制台只是在网络请求中说“待定”。

我尝试从 post 路由和相同的问题中删除 'authenticatedOrNot' 方法,但如果我删除所有三个它工作正常。

我难住了。

有帮助吗?还有其他人遇到这个吗?

4

2 回答 2

1

我遇到了与此非常相似的问题,因此我将其发布以防万一。问题似乎是我在护照​​函数中有另一个函数定义,这阻止了完成处理程序被调用。我认为这是问题所在,因为当我更改函数参数名称时,事情就开始起作用了。

事后看来,我认为错误很明显,但由于我是 node 新手,我对函数、回调、闭包等仍然有点不确定。我也有这样的印象,即 node 约定总是使用这些参数名称(错误,完成,下一个),并且有一些与它们相关的魔法。我想不是。随时教育我这一点。

无论如何,我使用的是从教程中复制的护照本地策略(在http://scotch.io/tutorials/javascript/easy-node-authentication-setup-and-local)。本教程使用 mongo,但我决定切换到 postgresql。所以我使用了https://github.com/brianc/node-postgres-pure中的 pg.js 模块,并使用了提供的示例代码。

这是代码的相关部分,在我最初将 pg.js 示例代码复制并粘贴到护照教程中之后:

//错误代码

passport.use('local', new LocalStrategy({
    // by default, local strategy uses username and password, we will override with email
    usernameField: 'email',
    passwordField: 'password',
    passReqToCallback: true // allows us to pass back the entire request to the callback
},
function(req, email, password, done) { 
    pg.connect(configDB.connectionString, function(err, client, done) {
        if (err) {
            return console.error('could not connect to postgres', err);
        }
        client.query('select email, password_hash from admin_user where email = $1', [email], function(err, result) {

            // check password against db, and then try to call passports done callback
            return done(null, userModel); // this actually invokes the pg.connect done callback

        });
    });
}));

因此,当它运行时,在返回 /login 的帖子上,对 done 的调用将调用 pg.connect done,而不是护照完成。

// 好的?工作代码

function(req, email, password, done) { 

    pg.connect(configDB.connectionString, function(err, client, connect_done) {
        if (err) {
            return console.error('could not connect to postgres', err);
        }
        client.query('select email, password_hash from admin_user where email = $1', [email], function(err, result) {
            connect_done() // free up postgres connection, which I should have been doing before
            // check password against db, and then
            return done(null, userModel); // invoke passport's done callback

        });
    });
}));

这段代码现在对我有用(除非我复制错误)。

于 2014-03-03T16:27:30.360 回答
0

当您拆分越来越多时,诊断此类故障变得更加容易......最好的方法是使用一些嗅探器(内置于 Chrome、Firefox、Opera 或独立)并准确获取您发送到服务器的标头。这非常有用,因为您可以将问题本地化到前端应用程序(<form acton="/admin/new"例如 - 错误输入)或后端。

让我们向您道歉,您的标头还可以,并且您在/admin/new路线上准确发送了 POST。由于您console.log( req );没有生效,显然应用程序没有达到这一点。这可能是因为authenticatedOrNot挂起或未adminRoute.create正确实例化。

authenticatedOrNot如我所见,可能会挂在/login重定向上,因为您没有提供处理此路线的方式。

adminRoute.create根据您将其附加到应用程序的方式,可能会导致一些麻烦。

因此,在简历中,我需要查看更多您的代码来确定问题所在。

于 2014-03-03T06:59:30.657 回答