我有一个表单,其提交按钮调用
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 有效,我们将返回 true
或 false
的 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/