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

编辑 NodeJS路由处理程序

// 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