【问题标题】:sending data with ajax and no real route in node.js使用 ajax 发送数据并且在 node.js 中没有真正的路由
【发布时间】:2014-01-18 17:39:15
【问题描述】:

我正在使用 node/express 开发一个网络应用程序。我有一个名为validation.js 的电子邮件验证javascript 文件。我想要做的是,一旦用户输入错误的电子邮件,电子邮件输入区域下就会出现错误消息。但它确实,似乎没有这样做。

validation.js:

var INVALID_EMAIL = "The email you entered is invalid";
var EMPTY_EMAIL = "You did not enter an email";

exports.validateEmail = function (email, callback) {
    console.log("In validate email");
    console.log(email);
    var email = 0;

    var emailFilter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;

    if (email.length == 0) {
        err = EMPTY_EMAIL;
        callback(err);

    }
    else if (!email.test(emailFilter)){
        err = INVALID_EMAIL;
        callback(err);
    }
}

在 app.js 中我添加了路由:

app.post("/validation/email", function(req, res) { validation.validateEmail(req) });

这里的 /valiation/email 不是真实视图。

我的登录信息如下所示:

login.jade:

form(action="")
    key EMAIL
        input(type="text", name="username", id="email")
        br
        span(class="email-error-message")
        br
    key PASSWORD
        input(type="text", name="password", id="password")
        br
        span(class="pw-error-message")
        br
    input(type="submit", name="loginButton", id="login-button", value="LOGIN")

我还没有实现密码的东西,所以忽略它。但是我在那里有跨度,以便在用户输入错误消息的情况下输出错误消息。

最后,我在 navigation.js 中有 ajax 调用:

$('#email').blur(function() {

console.log('inside click function in navigation.js');

$.post('/validation/email', $("#email").val() ,  function(data) {
     console.log('hello got here too');
    $(".email-error-message").html(data);
});
});

当我运行这个应用程序时,我收到控制台消息,我在 navigation.js 中的点击中,但是当我离开电子邮件输入区域时没有收到错误消息,警告我使用了无效的电子邮件。我已经尝试到处寻找答案,但我没有成功。我知道这样做是可能的,但坚持如何让它这样做。

任何帮助都是有用的。

【问题讨论】:

    标签: javascript ajax node.js express


    【解决方案1】:

    我认为问题出在这条线。

    app.post("/validation/email", function(req, res) { validation.validateEmail(req) });
    

    validateEmail 需要一个回调函数,但这里没有。

    编辑: 为了解决这个问题,我可能会一起消除回调,因为您在这里并没有真正使用它来做任何事情,除了将错误消息发送回客户端。

    我可能会这样做:

    将您定义 validateEmail 的部分更改为此

    exports.validateEmail = function (req,res) {
    

    然后:

    var email= req.email  //Or whatever references where the email is in your request
    

    最后:

    else if (!email.test(emailFilter)){
        err = INVALID_EMAIL;
        res.send(err);
    }
    

    现在您只需将 req 和 res 传递给您的 validate email 函数:

    app.post("/validation/email", function(req, res) { validation.validateEmail(req,res) });
    

    与以下内容相同:

        app.post("/validation/email",validation.validateEmail)
    

    因为 req 和 res 默认作为参数传入。

    【讨论】:

    • 你会建议我在回调中做什么?我对节点有点陌生
    • 嗯,你需要做一些改变。
    • 是的,我制作了它们,不过这对我有很大帮助。我让它工作了。谢谢。
    【解决方案2】:

    看来你应该试试看:https://npmjs.org/package/express-validator

    在你的 app.js 中:

    var ev = require('express-validator');
    

    并使用模块:

    app.use(express.urlencoded());
    app.use(ev());
    // * Order is important.
    

    制作一个中间件并传递错误对象:

     function validator(req, res, next) {
    
        req.checkBody('email', 'Invalid Email').isEmail();
        req.checkBody('password', 'Invalid Password ! Mustbe Between 6-20 Charctersters').len(6, 20);
    
        var errors = req.validationErrors(true);
        if (errors) {
                res.render('login', { errors: errors});
            }
        } else {
            next();
        }
    };
    

    使用此中间件设置路由:

    app.post('/login', validator, doLoginStuff);
    

    在翡翠模板中,您可以循环访问错误对象并从服务器端向客户端显示错误消息。在客户端,您可以根据需要使用任何客户端验证工具或 Html5 表单验证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多