抱歉,标题令人困惑,我将尝试解释
我正在使用具有express-form和自定义验证功能的node.js,如下所示:
app.post('/register', form(
field("username").trim().required().custom(function(value) {
//Works correctly
if (!user.validUsername(value)) {
throw new error("Invalid username");
}
//Does not work due to callback
user.uniqueUsername(value, function(uniqueUsername) {
if (!uniqueUsername) {
//Not unique, throw error
throw new Error("username is already taken");
//Could be subsituted for return "whatever"; and it would still be the same problem
}
});
}),
registerAttempt);
};
// ...
//Example function for brevity
user.uniqueUsername = function(username, callback) {
User.findOne({username: username}, function(err, user) {
if (err) { throw err; }
callback(user === null);
});
}
我需要一种方法来重组它,以便.custom(function(value){..})在接收到回调之前不会完成执行,但是我根本不知道该怎么做。
编辑:更正的错误
看起来express-form不支持异步验证,所以唯一的方法是实现自定义中间件。它看起来可能像这样:
app.post('/register',
function (req, res, next) { //here it goes
user.uniqueUsername(req.body.username, function(uniqueUsername) {
req.body.uniqueUsername = uniqueUsername; //we can't do anything about it yet
next();
});
},
form(field('username').trim().required().custom(function(value) {
if (!user.validUsername(value)) {
throw new error("Invalid username");
}
}),
field('uniqueUsername').custom(function(value) {
if (!value) {
throw new Error("username is already taken");
}
}),
registerAttempt);
它可以用作无法进行异步验证的快速表单的通用解决方法:我们将所需的所有数据提取到单独的中间件中,并将其作为新字段注入,然后由快速表单进行验证。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句