【问题标题】:Validate Mongoose Schema against external API针对外部 API 验证 Mongoose Schema
【发布时间】: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


【解决方案1】:

我检查了 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)))  
    }
  });
 }
});

我犯的错误是我试图在我的请求的回调函数之外解决我的 Promise。但是我要使用的数据显然只能在里面按时使用。

编辑: 用于理解 API 调用。 API 以{disposable: boolean} 的形式返回一个 JSON,输入的电子邮件地址是否属于 DEA(一次性电子邮件地址)服务

【讨论】:

    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2011-01-24
    • 2018-05-24
    • 1970-01-01
    相关资源
    最近更新 更多