gpt4 book ai didi

javascript - Node js函数需要返回值,但值来自回调,因此无法返回

转载 作者:太空宇宙 更新时间:2023-11-04 01:09:35 24 4
gpt4 key购买 nike

对令人困惑的标题表示歉意,我会尝试解释

我正在使用node.js express-form和自定义验证函数如下:

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);

它可以用作 Express-Form 无法进行异步验证的通用解决方法:我们将所需的所有数据提取到单独的中间件中,并将其作为新字段注入(inject),然后由 Express-Form 进行验证。

关于javascript - Node js函数需要返回值,但值来自回调,因此无法返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19339219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com