Javascript Node js函数需要返回值,但该值来自回调,因此无法返回
抱歉,标题太混乱了,我将尝试解释一下 我使用node.js和自定义验证函数,如下所示:Javascript Node js函数需要返回值,但该值来自回调,因此无法返回,javascript,node.js,express,Javascript,Node.js,Express,抱歉,标题太混乱了,我将尝试解释一下 我使用node.js和自定义验证函数,如下所示: app.post('/register', form( field("username").trim().required().custom(function(value) { //Works correctly if (!user.validUsername(value)) { throw new error("Invalid username");
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(函数(值){..})不会完成执行,但我不知道如何才能完成,如果有的话
编辑:更正错误看起来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);
它可以作为express form无法进行异步验证的通用解决方法:我们将需要的所有数据拉入一个单独的中间件中,并将其作为新字段注入,然后由express form进行验证。看起来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);
它可以作为express form无法进行异步验证的通用解决方法:我们将需要的所有数据拉入一个单独的中间件中,并将其作为新字段注入express form进行验证。对于这种情况,您需要颠倒调用顺序。比如:
User.findOne({username: username}, function(err, uniqueUsername) {
if (err) { throw err; }
app.post('/register', form(
field("username").trim().required().custom(function(value) {
if (!user.validUsername(value)) {
throw new error("Invalid username");
}
if (!(uniqueUsername === null)) {
//Not unique, throw error
throw new Error("username is already taken");
}
}),
registerAttempt
);
};
基本上,您需要在使用这些值之前获取它们(当这样说时,它看起来很明显,但异步编程往往使明显的变得不那么明显)
如果需要检查多个异步项,则需要以某种方式将它们链接在一起。异步库可以在必要时提供帮助。对于这种情况,您需要颠倒调用顺序。比如:
User.findOne({username: username}, function(err, uniqueUsername) {
if (err) { throw err; }
app.post('/register', form(
field("username").trim().required().custom(function(value) {
if (!user.validUsername(value)) {
throw new error("Invalid username");
}
if (!(uniqueUsername === null)) {
//Not unique, throw error
throw new Error("username is already taken");
}
}),
registerAttempt
);
};
基本上,您需要在使用这些值之前获取它们(当这样说时,它看起来很明显,但异步编程往往使明显的变得不那么明显)
如果需要检查多个异步项,则需要以某种方式将它们链接在一起。如果需要,异步库可以提供帮助