我的猫鼬模式如下:
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;
}
但这给了我一个错误,因为此函数不可分配进行验证。
请注意,这是我第一次尝试异步/等待功能。有人可以指出我在这里缺少什么吗?
更新: 因此,在花了整整一天时间熟悉回调的概念之后,并保证我提出了一个可行的解决方案。我将在下面提供它作为答案
答案 0 :(得分:0)
我检查了SO,但找不到解决方案。因此,如果有人再次遇到此问题,我将为此提供一个可行的解决方案。
如果要针对外部数据源验证字段,请尝试以下操作。该验证器将检查针对API(您当然也可以使用其他任何API)提供的电子邮件地址,该API检查地址是否为DEA,还使用ValidatorJS isEmail检查语法:
const YourSchema = new Schema({
// your fields
})
SchemaName.path('fieldNameToCheck').validate({
validator: function(value) {
return new Promise(function (resolve, reject) {
request.get('https://disposable.debounce.io/?email=' + value, function (error, response, data) {
if (error) reject(error);
const content = JSON.parse(data);
resolve((content.disposable === 'false' && isEmail(value)))
}
});
}
});
我犯的错误是我试图在请求的callback_function之外解决Promise。但是我要使用的数据显然只能按时在其中提供。
编辑:
为了了解API调用。如果输入的电子邮件地址属于DEA(一次性电子邮件地址)服务,则API会以{disposable: boolean}
的形式返回JSON