首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Node - Passport Auth - Authed Post Route在表单提交时挂起

Node - Passport Auth - Authed Post Route在表单提交时挂起
EN

Stack Overflow用户
提问于 2013-07-24 17:19:17
回答 2查看 1.5K关注 0票数 5

这是一个奇怪的问题。Im Passport的‘本地策略’为我的express应用程序,我遇到了一个奇怪的问题。

从本质上讲,我有三条路线。每一个都有一个身份验证检查。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.get('/admin', authenticatedOrNot, adminRoute.index);
app.get('/admin/new', authenticatedOrNot, adminRoute.newpost);
app.post('/admin/new', authenticatedOrNot, adminRoute.create);

authenticatedOrNot方法很简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var authenticatedOrNot = function(req, res, next){
    if(req.isAuthenticated()){
        next();
    }else{
        res.redirect("/login");
    }
}

非常适合登录到管理区域,并检查用户是否已登录,但当我向“/ admin /new”Post路径提交表单时,浏览器挂起。控制台中什么都不会发生,即使console.log已经就位:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
exports.create = function(req, res){
    console.log(req);
        // Database logic here
        res.redirect('/admin');
}

我好像不能让它工作。它只是挂起,并最终失败。浏览器控制台只是在网络请求中显示'pending‘。

我已经尝试从post路由中删除'authenticatedOrNot‘方法,但如果我将所有三个都删除,它工作得很好。

我被难住了。

有帮手吗?还有别的人碰到这个吗?

EN

回答 2

Stack Overflow用户

发布于 2014-03-03 16:27:30

我有一个与此非常相似的问题,所以我把这篇文章贴出来,以防它能有所帮助。问题似乎是我在passport函数中有另一个函数定义,这阻止了done处理程序被调用。我认为这就是问题所在,因为当我更改函数参数名称时,它就开始工作了。

事后看来,我认为错误是显而易见的,但由于我是第一次接触node,我对函数、回调、闭包等仍然有点不确定。我也有这样的印象,即节点约定总是使用这些参数名称(err、done、next),并且与它们相关的有一些魔力。我想不是这样的。在这一点上,请随时教我。

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

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

//错误代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的post中,对done的调用将调用passport done,而不是pg.connect done。

//好吗?工作代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

        });
    });
}));

这段代码现在可以为我工作了(除非我错误地复制了一些东西)。

票数 1
EN

Stack Overflow用户

发布于 2014-03-03 06:59:31

当你拆分得越来越多时,诊断这样的麻烦变得容易得多.最好的方法是使用一些嗅探器(内置在Chrome、Firefox、Opera或独立浏览器中),并准确地获取您发送到服务器的头文件。这非常有用,因为您可以将问题定位到前端应用程序(例如,<form acton="/admin/new"错误类型)或后端。

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

正如我所见,authenticatedOrNot可能会挂起/login重定向,因为您没有提供如何处理此路由的方法。

adminRoute.create可能会带来一些麻烦,这取决于你将它附加到你的应用程序中的方式。

因此,在简历中,我需要看到更多你的代码来建立麻烦。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17840762

复制
相关文章
如何在 Python 中创建元组字典
本演练是关于在 Python 中创建元组字典的全部内容。此数据结构存储键值对。通过组合字典和元组,可以创建元组字典。好处是以结构化格式组织且可访问的数据。可以轻松表示每个键的多个值,例如学生成绩或联系信息。让我们看看它如何有效地存储和检索复杂数据。
很酷的站长
2023/08/11
2630
如何在 Python 中创建元组字典
创建 WebRTC 会话
一WebRTC 是一套基于 Web 的实时通信解决方案,通过浏览器内置的 API 来支持音视频通道的搭建。
派大星在吗
2021/12/05
5.6K0
如何在Python中创建天气警报系统
通过阅读这篇文章,你将学会用Python创建一个天气警报系统,当它预测未来几小时内天空将下雨/下雪时,它会向多个收件人发送一封电子邮件通知。电子邮件通知包含其他信息,如预测的温度和湿度。
HuangWeiAI
2020/12/18
2.6K0
python变量'创建,引用,销毁'
引用: 当参数被引用,python引用计数器自增1 python中列表和字典引用示例 列表: def add_list(p): p+=[3] 或 p=p+[3] //print结果不一致,+、+=实现不同方法 p=[1,2] add_list(p) print(p) 字典: def add_dictionary(): b=a={‘one’:1,’two’:2} print(‘{}’.format(a[‘one’])) b[‘one’]=2 b[‘two’]=1 print(‘{}’.format(b[‘one’]))
py3study
2020/01/07
1.9K0
Python变量之白首如新,倾盖如故
python中的变量 变量:将运算的中间结果暂存到内存中,方便后续程序调用。 变量的命名规则: 1、变量名由字母、数字、下划线组成。 2、变量名可以用字母、下划线开头,但是不能以数字开头。 3、变量名是区分大小写的。 4、变量名不能使用关键字。 5、变量名最好不要用中文或者拼音。 6、变量名最好起的要有意义,具有描述性。 7、变量名最好不要太长。 8、变量名最好使用驼峰命名法或者下划线命名法。
py3study
2020/01/17
5750
python中画雷达图_如何在Excel中创建雷达图
参考链接: Python | 使用XlsxWriter模块在Excel工作表中绘制雷达图
用户7886150
2020/12/23
2.3K0
如何在js中创建对象
七夕临近了,没有对象的来创建一个吧 使用对象字面量: const o = { name: "zehan", greeting() { return `Hi, 我是${this.name}`; } }; o.greeting(); // "Hi, zehan" 使用构造函数: function Person(name) { this.name = name; } Person.prototype.greeting = function () { return `Hi, 我是
ZEHAN
2020/09/23
7.6K0
如何在Dynamo中创建UI
本文介绍了如何在Dynamo中创建UI,通过使用WPF技术实现了窗口的创建和交互。首先介绍了IronPython和Dynamo的基础知识,然后讲解了实现原理和准备工作。最后通过具体的操作步骤和代码示例讲解了如何在Dynamo中创建UI。
企鹅号小编
2018/01/05
2.1K0
如何在Dynamo中创建UI
如何在Mac中创建MiniKube
Minikube是一个工具,可以在本地轻松运行Kubernetes。 Minikube在笔记本电脑的VM中运行单节点Kubernetes集群,供希望尝试Kubernetes或日常开发的用户使用。
方志朋
2022/05/08
2.4K0
如何在Mac中创建MiniKube
Python动态创建变量的方法
Python内置函数exec()可以用来执行Python代码或内置函数compile()编译的代码对象,例如 >>> exec('print("hello world")') hello world >>> t = compile('print("hello world")', 'temp.tmp', 'exec') >>> t <code object <module> at 0x000001ED08FE5300, file "temp.tmp", line 1> >>> exec(t) hello wo
Python小屋屋主
2018/04/16
1.7K0
如何在Ubuntu14.04中创建Python虚拟环境
在Ubuntu14.04中安装Python相对比较容易些,最简单的安装方法就是apt-get安装了,具体的教程可以戳这篇文章:在Ubuntu14.04中如何安装Python3和切换py2和py3环境。今天小编给大家分享一下,如何在Ubuntu14.04创建Python虚拟环境,具体的教程如下。
Python进阶者
2018/09/16
1.6K0
如何在Ubuntu14.04中创建Python虚拟环境
在Ubuntu14.04中安装Python相对比较容易些,最简单的安装方法就是apt-get安装了,具体的教程可以戳这篇文章:在Ubuntu14.04中如何安装Python3和切换py2和py3环境。今天小编给大家分享一下,如何在Ubuntu14.04创建Python虚拟环境,具体的教程如下。
Python进阶者
2018/10/18
1.2K0
如何在Ubuntu14.04中创建Python虚拟环境
聊聊如何在K8S中实现会话保持
故事的起因是朋友所在的部门最近基于auth2实现单点登录,他们在测试环境单点登录,运行得好好的,但他们把单点登录上到预发布环境,发现单点登录不好使了。他们有部分系统是以授权码式接入,发现第一次登录拿到授权码进行换取token时,会提示授权码失效。而他们测试环境和预发布环境的代码是一样的。
lyb-geek
2023/03/14
1.4K0
聊聊如何在K8S中实现会话保持
如何在 WordPress 中创建联系表格?
假设我们有一个 WordPress 网站,并且我们想要添加一个功能,让他们可以联系他们所拥有的查询。我们可以通过使用网站上的 WordPress 插件添加联系表格来做到这一点。因此,这将为你的访问者提供一种与你联系的方式,当他们需要帮助或有什么要分享的时候。
海拥
2022/12/19
2.9K0
如何在 WordPress 中创建联系表格?
如何在 WordPress 中创建登录页面
登陆页面: 登陆页面是为特定受众制定的具有特定目标的目标页面,可以描述为“一页一目的”。登陆页面必须有一个“号召性用语”,并牢记特定目标。成功的着陆页是具有更高转化率、更高参与度和更高质量潜在客户的页面。
海拥
2022/10/04
2.9K0
如何在 WordPress 中创建登录页面
如何在git中创建新分支
介绍 Git 是一个开源版本控制系统,用于在软件开发过程中跟踪更改。它的相互独立的分支模型使其脱颖而出。分支可以基于以前版本的软件来保持当前进度的完整性,同时处理错误修复或新功能。 在本地创建 Git 存储库 要创建新的 Git 存储库,请在终端中输入以下命令: mkdir rumenz cd rumenz git init 这将在 rumenz 目录中创建并初始化一个新的 Git 存储库。创建一个新的降价文件并添加一行文本: echo This is a line of text > rumenz.md
入门笔记
2022/06/02
2.9K0
python中的变量
  什么是变量?总结不好也记不得它的完整定义,就举个例子来便于自己学习总结吧。假如我们要计算1+2的值,那么首先在内存中要存储两个值,一个是:1,一个是:2。内存中有了这两个值,计算的时候就会找到它们进行计算。但是我们可能是计算任意两个数相加,数学中我们常用 x+y 来表示两个任意的数相加。假如在程序中我们用a+b来表示两个数相加,那么当a=1,b=2时,就可以计算出1+2=3,此时这个a和b就是变量,它们也可以等于其他数值,结果也是随着数值的改变而改变的。a和b的值能变动,就叫变量。刚才说了内存中存了1和2,那么a和b与内存中的1和2有什么联系呢,可以理解为a=1,b=2就是把内存中的1取个名字叫a,内存中的2取个名字叫b。这样按名字就能找到它的值了。
py3study
2020/01/19
2.5K0
python中的变量
点击加载更多

相似问题

会话变量,如Python中的PHP

21

Python会话(如php)类

21

如何在DotNetNuke皮肤中创建会话变量?

10

如何在express中创建全局会话变量

112

创建会话时在Grails中创建会话变量

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文