【问题标题】:Node.js + Express.js + Passport.js - i need some advice how to structure themNode.js + Express.js + Passport.js - 我需要一些建议如何构建它们
【发布时间】:2015-05-03 15:02:37
【问题描述】:

我找到了这个关于 Node.js + Express.js + Passport.js 的教程 tutorial on scotch.io

我需要一些建议。

1) 本地注册检查输入数据

在此示例中,没有检查登录或注册的输入数据,例如检查电子邮件是否为空或无效,或者添加验证码控件,所以,如果我需要添加它们更好的位置在哪里?

在passport.js里面?

在 routes.js 中?

在其他文件中?

2) 注册 POST 和 GET

在这个例子中,我有两条路线,一条 GET 用于呈现表单,一条 POST 用于处理表单提交。

我想,如果出现错误,用错误消息呈现表单,但也用输入的数据填充所有输入文本。

如果我检查 POST 路由中的输入数据,当我重定向到 GET 路由时,我需要将所有错误消息以及提交的值传递给它。

我用 req.flash 来做这个?

在同一个函数中处理 GET 和 POST 更好吗?

还有另一种(更好的)方法吗?

感谢大家的建议和帮助

【问题讨论】:

    标签: node.js express passport.js


    【解决方案1】:

    要回答问题1),由于您所说的额外表单验证不是护照流程的一部分,我建议将其保存在与config/passport.js 分开的自己的中间件中。您可以定义您的函数,类似于已经存在的isLoggedIn helper。像这样:

    function validateSignup(req, res, next) {
        // Perform your field validation and/or CAPTCHA checking here
        if (!verifyCaptcha(req.body)) {
            return res.status(401).end();
        }
        next();
    }
    
    app.post('/signup', validateSignup, passport.authenticate('local-signup', {
        successRedirect : '/profile', // redirect to the secure profile section
        failureRedirect : '/signup', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    }));
    

    对于2) 及以后,

    我想,如果出现错误,用错误消息呈现表单,但也用输入的数据填充所有输入文本。

    我认为实现这一点的最简单方法是将您的注册/登录 POST 作为 AJAX 请求而不是进行传统的表单提交,并让您的 POST 路由返回 JSON 结果而不是呈现 HTML 页面。这样您的页面不会刷新,并且您的表单值将保持原样。粗略地说,使用 jQuery,您的客户端代码可能看起来像这样:

    $("#signup-form").submit(function(e){
        // Prevents your form from submitting as usual
        e.preventDefault();
    
        $.post('/signup', $('#theform').serialize())
          .done(function() {
            // Success! Navigate to home page
          })
          .fail(function(jqXHR, textStatus, errorThrown) {
            // Show error in UI
          });
    });
    

    要在您的 UI 中突出显示表单错误,那就是另一回事了,这取决于您使用的框架。例如,如果您使用引导程序,我会推荐 bootstrapValidator

    在同一个函数中处理 GET 和 POST 更好吗?

    不,我肯定会将这些路线分开。此外,如果您确实选择遵循上面的 AJAX 建议,我会发现如果我将我的 HTML 服务路由组织在与我的 JSON 路由不同的路径下会更容易。例如,如果我有一个显示注册页面的 signup 路由,以及一个用于发布注册表单的 JSON 端点,我会这样组织它:

    GET /signup

    POST /api/signup

    【讨论】:

    • 感谢您快速回复安德鲁。 Ajax 和 jQuery 是一个很好的解决方案,我也在考虑将 Angular.js 用于应用程序的其他部分。为了更好地组织代码,最好将“validateSignup”等函数作为函数模块放入单独的文件中?或不。现在我通常将所有逻辑都放入路由函数中,但它一团糟:)
    • 如果你手头有一个相当大的应用程序,AngularJS 将是一个不错的选择,比纯 jQuery 更好。至于拆分单独的模块,您必须考虑您这样做的原因。例如,您这样做是为了让您的方法更容易找到吗?您是否打算在多个项目之间共享此代码? “实用程序函数”模块可能是保存在整个代码中使用的通用小型实用程序助手的好地方,但我不希望在那里找到validateSignup
    猜你喜欢
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2014-12-16
    • 2014-01-19
    相关资源
    最近更新 更多