Node.js / Express:POST变为GET(代码302)

时间:2015-02-19 05:26:20

标签: node.js http express passport.js passport-local

简而言之,我有一个登录页面,我的POST请求在Express 4中变为GET

以下是我的登录页面的业务部分:

<form id='loginForm' action='/login' method='post'>
    <table>
        <tr>
            <td><input type='text' name='username' /></td>
        </tr>
        <tr>
            <td><input type='text' name='password' /></td>
        </tr>
        <tr>
            <td><button type='submit'>Submit</button></td>
        </tr>
    </table>
</form>

以下是我设定的路线:

// Express 4    
var router = express.Router();

router.get('/login', function(req, res) {
    res.render('./login.hbs', { message: req.flash('loginMessage') });
});

router.post('/login', passport.authenticate('local-login', {
    successRedirect: '/welcome',
    failureRedirect: '/login',
    failureFlash : true
}));

passport.use('local-login',
    new LocalStrategy(
        {
            usernameField: 'email',
            passwordField: 'password',
            passReqToCallback : true
        },
        function(req, email, password, next) {
            User.findOne({ 'authLocal.email' :  email }, function(err, user) {
            console.log('Inside local-login strategy with findOne A');
            [snip]

我在res.render的{​​{1}}以及GET /login策略的findOne()来电中设置了断点。当我点击“提交”按钮时,抓取内容的断点位于local-login代码中。

在调试器中,router.get()req.method

在浏览器(Chrome)中,我被告知我正在对{}返回302的GET进行发布操作。还有一个等待/loginGET的200个代码。这两个代码(302,200)是调试器在/login中停止的时间。即使清除浏览器缓存也无济于事。

有人可以告诉我为什么我的router.get()请求没有得到尊重吗?

2 个答案:

答案 0 :(得分:1)

简单回答

POST /login变成GET /login 302背后的原因是护照模块完成的重定向。

请参阅以下代码中的failureRedirect

router.post('/login', passport.authenticate('local-login', {
    successRedirect: '/welcome',
    failureRedirect: '/login',
    failureFlash : true
}));

当提供的凭据无效或服务器因任何原因无法进行身份验证时,可能会发生这种情况。

快乐帮助!

答案 1 :(得分:0)

根据this documentation,该策略看起来只有local而不是local-login

它看起来像passport.use函数的第一个参数应该是LocalStrategy对象,而不是字符串。

试一试!