根据外部API验证猫鼬架构

时间:2019-04-23 14:05:03

标签: node.js typescript mongoose-schema

我的猫鼬模式如下:

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

但这给了我一个错误,因为此函数不可分配进行验证。 请注意,这是我第一次尝试异步/等待功能。有人可以指出我在这里缺少什么吗?

更新: 因此,在花了整整一天时间熟悉回调的概念之后,并保证我提出了一个可行的解决方案。我将在下面提供它作为答案

1 个答案:

答案 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