【发布时间】:2022-02-02 18:36:06
【问题描述】:
我有一个像下面这样的猫鼬模式:
const User: Schema = new Schema({
// some other fields
email: {type: String, unique: true, require: true, validate: [myValidator, 'invalid email provided'],
// some more fields
)};
我的 myValidator 使用 validatorJS isEmail 函数来检查是否输入了有效的电子邮件地址,如下所示:
function myValidator(email: String) {
return isEmail(email: String, {require_tld: true, domain_specific_validation: true});
到目前为止,所有这些都按预期工作。但是现在我遇到了以下问题,这可能与我对 Typescript/JaveScript 的理解有限有关。
我想扩展 myValidator 以根据外部 API 检查输入的电子邮件地址。
到目前为止,我已经尝试过这样的事情:
function myValidator(email: String) {
let isValid = false;
request('https://disposable.debounce.io/?email=' + email, { json: true }, async (err, res, body) => {
if (err) { return console.log(err); }
isValid = body.disposable;
});
if (isValid && !isEmail(email, {require_tld: true, domain_specific_validation: true})) {
return false;
}
但这显然会失败,因为请求是异步操作,所以isValid 将永远是false
所以我“试图”使这个函数成为异步/等待函数。
function myValidator(email: String) {
const remoteCheck = function() {
return new Promise(function() {
request('https://disposable.debounce.io/?email=' + email, { json: true }, async (err, res, body) => {
if (err) { return console.log(err); }
return body.disposable;
});
});
};
async function f() {
const isValid = await remoteCheck();
if (isValid === true) {
return false;
} else {
isEmail(email, {require_tld: true, domain_specific_validation: true});
}
}
if(f()) {
return true;
} else {
return false;
}
但这给了我一个错误,因为这个函数不可分配给验证。 请注意,这是我第一次尝试异步/等待功能。有人可以指出我在这里缺少什么吗?
更新: 因此,在我花了一整天时间来熟悉回调和承诺的概念之后,我想出了一个可行的解决方案。我将在下面提供它作为答案
【问题讨论】:
-
你好,我试试这个。你能确认我正在使用github.com/request/request 进行外部 api 调用吗?
-
谢谢,是的,我正在使用这个。
-
您是否尝试过使用与此库关联的请求承诺库之一?
-
不,我还没有尝试过
-
对不起,我怕帮不了你..
标签: node.js typescript mongoose-schema