Node.js / Express:POST请求被转换为GET请求(代码302)

4
简而言之,我有一个登录页面,在其中我的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]

我在GET /loginres.renderlocal-login策略中的findOne()调用上设置了断点。当我点击“提交”按钮时,捕获事件的断点位于router.get()代码中。
在调试器中,req.methodGET
在浏览器(Chrome)中,我被告知我正在向/login进行POST并返回302。还有一个挂起的GET/login,返回200代码。这两个代码(302、200)是调试器停在router.get()时出现的。即使清除浏览器缓存也无济于事。
有人能告诉我为什么我的POST请求没有被处理吗?
2个回答

1

简单回答

POST /login 被转换为 GET /login 302 的原因是 passport 模块进行的重定向。

请看以下代码中的 failureRedirect

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

当提供的凭据无效或服务器由于任何原因无法验证时,就会发生这种情况。
愉快地帮助!

0

看起来策略是 local 而不是 local-login,见this documentation

同时,似乎passport.use函数的第一个参数应该是 LocalStrategy 对象,而不是字符串。

试一下吧!


1
passport.use(label, object) 是合法的。来自 http://passportjs.org/guide/authorize/:用于授权的策略与用于身份验证的策略相同。但是,应用程序可能希望使用同一第三方服务提供身份验证和授权。在这种情况下,可以使用命名策略,通过覆盖调用 use() 中策略的默认名称来实现。passport.use('twitter-authz',new TwitterStrategy({...我的代码正在使用“自己命名”的变体。 - Jerome P Mrozak
你是正确的,我道歉。你还遇到这个问题吗? - Brennan
我放弃了自己的代码,并从scotch.io的示例开始重新编写。我不再有那个问题了。但是,我无法将此结果标记为此Q的“答案”,因为该站点上的某些监视器会将其标记为不适当的答案。 - Jerome P Mrozak
另外,因为我实际上没有回答你的问题!我很高兴听到这不再是一个问题,但我仍然很好奇发生了什么。 - Brennan
我也很好奇,但不再有获取答案的压力。谢谢回复。 - Jerome P Mrozak
我遇到了类似的问题,有人有解决方法吗? - Brainwash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接