Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 共享后端和前端输入验证或模块_Javascript_Node.js_Reactjs_Validation - Fatal编程技术网

Javascript 共享后端和前端输入验证或模块

Javascript 共享后端和前端输入验证或模块,javascript,node.js,reactjs,validation,Javascript,Node.js,Reactjs,Validation,我想共享输入验证,因为: 前端的用户体验,即时告知用户输入是否正确/错误 后端的安全问题,即使用户绕过了前端javascript,用户也无法处理RESTful API 此外,前端中的javascript始终取决于解释它的浏览器,因此不可信任 在完整的javascript web应用程序中共享输入验证的最佳方式是什么(前端:react,后端:nodejs) 我考虑的解决方案是创建一个验证器模块,将所有javascript验证器放在代码库的根目录下: 如果在本地主机上,两种环境都使用此模块验证

我想共享输入验证,因为:

  • 前端的用户体验,即时告知用户输入是否正确/错误
  • 后端的安全问题,即使用户绕过了前端javascript,用户也无法处理RESTful API
  • 此外,前端中的javascript始终取决于解释它的浏览器,因此不可信任
在完整的javascript web应用程序中共享输入验证的最佳方式是什么(前端:react,后端:nodejs)

我考虑的解决方案是创建一个验证器模块,将所有javascript验证器放在代码库的根目录下:

  • 如果在本地主机上,两种环境都使用此模块验证输入
  • 如果在生产/预处理中,部署脚本会在部署之前在前端和后端复制模块
  • 每次尝试验证输入时,导入代码都是这样的:
    const validator=process.env.env=='local'?require('../../validator'):require('/validator')

有没有其他被广泛接受的方法可以做到这一点(我想这是一个非常常见的问题,但我没有发现类似的问题)?如果不是,我的方法正确吗

通常,您会在前端进行简单的验证,在后端进行更复杂的验证


例如:用前端的正则表达式验证电子邮件,发送一个简单的邮件来确认电子邮件的存在< /p> < p>这是一个很好的实践,使用验证作为一个模块,但是你应该考虑如果某种原因,你会发生什么,你想要/想要将后端技术改变成不是JavaScript之类的东西。


如果您要实现它,那么客户机和服务器将依赖于此模块,并且您必须维护此模块的不同版本,或者在任何时候进行验证更改时部署客户机代码和服务器代码,这会导致一些复杂性,您也应该考虑到这一点.

答案和实施要点:

  • 实现工作正常,是利用fullstack javascript应用程序的好方法
  • 这会造成一些复杂性,您需要小心不要实现在两个非常不同的环境(在客户端浏览器和nodejs后端)之间行为不同的库/javascript方法。因此,我不会在验证器中使用任何第三方库,只使用普通javascript(例如:不要在验证器中使用
    export
    关键字,而是使用
    module.exports={}
    ,因为ES6
    export
    在nodejs中不起作用)
  • 如果您想避免生产中的bug,每次修改
    验证程序
    模块并在这两种环境中进行测试时,您都应该在前端和后端部署(我添加了一个在部署之前运行的脚本,并检查两个模块之间的差异)
  • 因为它让我获得了很多时间,我现在也在我的应用程序中分享了其他的函数式编程
  • 意识到这种使用您自己的模块的方式与在前端和后端使用npm模块非常相似(如果您认为它对社区毫无用处,那么它比必须在npm注册表上发布它要简单得多)

您希望在前端和后端进行验证是正确的。如何做到这一点取决于您,但如果您的验证是某种模块,那么您的解决方案可能会起作用。我认为你需要对FE和BE进行不同的验证,因为你有不同的目标。FE-用户旅程,不允许输入失败/错误。BE-不允许数据会破坏/损害系统,FE+BE-确保数据“有效”(即电话号码是电话号码等)。但共享代码将非常有用。使用最新浏览器的用户如果不尝试绕过前端验证,则在提交输入之前总是会收到错误。所以我至少需要一个和我的前端一样严格的后端验证,然后我可以在后端添加一些自定义验证。共享它将节省大量时间,避免重复代码,并在后端和前端团队更改输入验证时同步。感谢您提出有效数据和有害数据之间有趣的区别。更复杂的数据通常意味着您至少可以在简单数据的基础上进行构建。这就是为什么我想用后端复制前端验证。这并不意味着我没有在后端进行自定义验证。在后端生成的代码可能不会按照此方法进行优化,但我更希望获得额外的安全性+前端/后端同步,而不是额外的性能。我想知道,您是如何实现这一点的?我正在考虑做类似的事情,但我不知道如何开始。。。您是否创建了FE和BE导入的新包,如导入“我的共享模块”?或者您只是引用两个项目之外的文件夹吗?根据我的记忆,我根据我的环境进行了条件导入。如果我在本地,我引用了项目外部的文件夹。如果在prod中,我直接引用该文件(它们都是在部署之前由脚本复制的)。我不知道我能不能精确。我想肯定有更好的方法