NodeJS 返回无效的有效电子邮件地址正则表达式



EDIT NodeJS route handler

// require() statements above
let error = {};
module.exports = {
  authorize: (req, res, next) => {
    const USERNAME  = req.body.username,
          PASSWORD  = req.body.password,
          SCOPES    = req.body.scopes;
    console.log(req.body);
    const SCOPE_LOOKUP = ['read', 'write', 'admin'];
    if(!VALIDATE_EMAIL(USERNAME)) {
      error.message = 'Invalid username.';
    }
    if(error.message) { return next(error) };
    return res.status(200).json(req.body);
  }
};

下面的代码在我正在处理的 NodeJS 应用程序上运行。const电子邮件地址填充了req.body.email的内容,我正在使用 Postman 进行 API 调用。

运行下面的代码并传递有效的电子邮件地址将按预期工作。但是,如果我传递了一个无效的电子邮件地址,代码也可以按预期工作,但是当我传入另一个有效的电子邮件地址时,我最终会得到Invalid email.这发生在不重新启动服务器的情况下。

我错过了执行顺序或范围是否存在问题?

const VALIDATE_EMAIL = email => {
    const EXP    = /^(([^<>()[]\.,;:s@"]+(.[^<>()[]\.,;:s@"]+)*)|(".+"))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9]+.)+[a-zA-Z]{2,}))$/;
    const DOMAIN = '@example.com';
    const OUTPUT = (EXP.test(email) && email.indexOf(DOMAIN, email.length - DOMAIN.length) !== -1) ? true : false;
    return OUTPUT;
};
(() => {
    let error = {};
    const EMAIL = 'joebloggs@example.com';
    if(!VALIDATE_EMAIL(EMAIL)) {
        error.message = 'Invalid email.';
    }
    if(error.message) { console.log(error.message); return };
    console.log(EMAIL);
})();

您的问题是您在应用程序的整个生命周期中保留错误消息。不要在处理程序范围之外声明error对象...您需要在请求处理程序中声明 error 对象,以便每个请求都有一个新的 error 对象(以及随后的错误消息)。

module.exports = {
  authorize: (req, res, next) => {
    const error = {
      message: '',
      something: '',
      foo: ''
    };
    const USERNAME  = req.body.username,
          PASSWORD  = req.body.password,
          SCOPES    = req.body.scopes;
    console.log(req.body);
    const SCOPE_LOOKUP = ['read', 'write', 'admin'];
    if(!VALIDATE_EMAIL(USERNAME)) {
      error.message = 'Invalid username.';
    }
    if(error.message) { return next(error) };
    return res.status(200).json(req.body);
  }
};

原则上,永远不要做你正在做的事情(尽管它似乎有效)。使用像电子邮件地址这样的库。

npm install email-addresses;
const parseEmail = require('email-addresses').parseOneAddress;
let parseResult = parseEmail(EMAIL);
console.log(parseResult);

这将输出...

{ parts: 
   { name: null,
     address: 
      { name: 'addr-spec',
        tokens: 'joebloggs@example.com',
        semantic: 'joebloggs@example.com',
        children: [Object] },
     local: 
      { name: 'local-part',
        tokens: 'joebloggs',
        semantic: 'joebloggs',
        children: [Object] },
     domain: 
      { name: 'domain',
        tokens: 'example.com',
        semantic: 'example.com',
        children: [Object] } },
  name: null,
  address: 'joebloggs@example.com',
  local: 'joebloggs',
  domain: 'example.com' }

因此,如果您需要该域,请获取parseResult.domain

最新更新