javascript - 通过在 Node 中发出 http 请求来验证表单输入

标签 javascript node.js request

我有一个表单,其提交按钮调用

exports.postUpdateProfile = function(req, res, next) {
  User.findById(req.user.id, function(err, user) {
    if (err) return next(err);
    user.email = req.body.email || '';
    user.profile.name = req.body.name || '';
    //check req.body.rescueTimeKey by making http request,
    //and parsing response to ensure the key is good
    user.profile.rescueTimeKey = req.body.rescueTimeKey;

    user.save(function(err) {
      if (err) return next(err);
      req.flash('success', { msg: 'Profile information updated.' });
      res.redirect('/account');
    });
  });
};

我想在保存配置文件之前确保 req.body.rescueTimeKey 有效,我尝试创建一个模块来执行该检查...

//rescue-time.js module

var request = require('request');
exports.validKey = function(key){
var options = {
    url: 'https://www.rescuetime.com/anapi/data?key=' + key,
    json: true
};

var cb = function callback(error, response, body){  
    if(error || body.error){
        //Key is bad, flash message and don't allow save
    }
    //key is good, save profile
};
request(options, cb);
}
正如您可能想象的那样,我没有完全掌握在进行异步调用时使用回调的 Node 样式,非常感谢任何重新组织此代码的帮助。

最佳答案

您需要做的是向您的 validKey 函数添加一个额外的参数以接受回调,这就是我们将在请求后使用的回调。

所以你的rescue-time.js看起来像这样:

// rescue-time.js
var request = require('request');

exports.validKey = function(key, cb) {
  var options = {
    url: 'https://www.rescuetime.com/anapi/data?key=' + key,
    json: true
  };

  request(options, function (error, response, body) {
    if(error || body.error){
        cb(false)
    }
    else {
      cb(true);
    }
  });
};``

如果 key 有效,我们将返回 truefalse 的 bool 结果。

在 Controller 中,您需要类似以下内容:

var rescueTime = require('./path/to/rescue-time.js');

exports.postUpdateProfile = function(req, res, next) {
  User.findById(req.user.id, function(err, user) {
    if (err) return next(err);
    user.email = req.body.email || '';
    user.profile.name = req.body.name || '';
    //check req.body.rescueTimeKey by making http request,
    //and parsing response to ensure the key is good
    user.profile.rescueTimeKey = req.body.rescueTimeKey;

    // We're sending in a callback function that will have a "valid" result as a second arg
    rescueTime.validKey(user.profile.rescueTimeKey, function(valid) {
      // check if valid returned true or false and act accordingly 
      if (!valid) {
        req.flash('error', 'invalid rescueTime key');
        res.redirect('/account');
      }
      else {
        user.save(function(err) {
          if (err) return next(err);
          req.flash('success', { msg: 'Profile information updated.' });
          res.redirect('/account');
        });
      }    
    });
  });
}; 

请记住,此代码根本没有经过测试,而只是一个示例,说明您需要做什么才能获得所需的结果。

关于javascript - 通过在 Node 中发出 http 请求来验证表单输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23418411/

相关文章:

mysql - Sequelize 使用 MySQL 抛出断言错误

node.js - 将方法附加到未调用的 Node 中的模式

sockets - nginx 如何复用单个套接字

javascript - 在 JS 上注册按钮点击处理程序的函数

javascript - 使用 JavaScript 进行访问限制

node.js - 如何使用应用程序用户连接到数据库?

asp.net-mvc - MVC3 记录请求的最佳方式

node.js - Nodejs发送大量请求时请求ETIMEDOUT

javascript - 从数组中删除特定元素 - javascript

javascript - 为什么当我运行 Jquery 函数时会触发 HTML 5 验证