很久以前,我听说过NodeJS及其神奇的特性。 即使那样,我真的不认为这可以“改变我的世界”,只是另一种时尚。 大约两周前,我读到了惊人的文章“我如何在100美元的服务器上用5天的时间构建一个拥有500,000个用户的应用程序”,对此我真的很感兴趣。 暑假和花大量时间在医院里等待的需求就完成了其余的工作。
先前状态
我以前关于MEAN y虫的状态是如此简单:我一无所知。 我以不同的方式听说过它,但是……从不使用,阅读它,对它好奇,对它思考或其他。 我具有良好的JavaScript技能,并且可以使用JQuery做非常好的事情,仅此而已。
这个主意
在sysadmin工作中,被远程计算机攻击就像呼吸一样,您无需考虑发生这种情况。 当您运行20台以上的服务器时,atacks警报会突然停止(我每小时收到500封有关远程人员或试图记录或发送邮件或入侵我或…的脚本的电子邮件,等等),因此我意识到我自己的DNSBL很容易阻止所有远程攻击者。
基本上,我只需要2个组件:
- 充当RBL服务器的DNS服务器
- 用于添加新IP,通知用户,显示IP状态,请求IP解锁的网页
因此,这是测试易于执行的服务器NodeJS的理想方案
加热
首先,我认为阅读本书很重要,因此我得到了两本书:
- 介绍NodeJS atravésde koans(西班牙语)
- MongoDB:权威指南,第二版
- MEAN.io文档
- Aprendecómocrear un API REST usando Node.js,Express y和MongoDB(西班牙语)
而且,更重要的是,我花了大约八个小时研究其他代码。 只需转到Github并搜索“ nodejs演示”,阅读,尝试理解其他代码,在Google上搜索疑问等,就没有最好的学习方法。
经过大约14个小时的加热,我想我已经准备就绪。
浓度
在开始一个新的proyect之前,我总是做“ 5分钟的浓度,要做什么”。 这对我来说真的很重要,所以我可以制作一张关于精神病学的地图,定义重要的事情,等等。
对于这个项目,我只关注一件事: 只是MVP 。 我的目标是向自己证明我可以做到这一点,只是为了娱乐和学习,所以我强迫自己去做一些有用的事情。 没有设计,没有UI,一无所有。 只是RBL系统的一小部分MVP。
开发环境
到目前为止,此保护程序应在Ubuntu Xenial VPS上运行,我制造了Vagrant机器,并在简单的shell脚本上复制了所有安装步骤。 这样,我可以毫无问题地在最终的VPS上重现它。
使用Puppet或Chef之类的其他方式似乎更复杂。
节点库
我想使用较少数量的nodejs库,以避免阅读过多的api文档并使之更加简单。 最终库如下所示:
- dnsd: RBL服务器上的核心库
- whois:在新IP上添加whois信息
- mongoose:用于mongo的简单对象建模,用于验证数据
- mongo:对于简单查询,我使用mongo纯查询
- express:网络环境
- pm2:在全局安装中,用于处理守护程序选项。
开发过程
我从RBL服务器开始,这似乎更容易。 那是个大错误。 到目前为止,我还没有真正理解面向事件的模式,我花了大约一个小时来尝试解决与函数顺序有关的愚蠢问题。 一旦我了解了问题所在,便改变了开发结构(在diferentes文件上使用单独的功能,等等),并将所有RBL服务器编程在一个文件上,该文件具有大约5个线程函数,最多不超过70行。 这段代码很烂,但是(相对)易于阅读和遵循,并保护我免受我自己的知识空虚的侵害。
在两次完全重建之后,构建RBL服务器花费了我大约2个小时的实际工作。 第一次任务完成😉
服务器完成后,就可以移动到网页了。 我使用一个只有三个文件夹的简单模板:
- controllers:一个与url相关的文件。 例如,文件ip.js处理所有与/ api / ip相关的功能。
- 型号:一个文件巫婆通过mongo集合具有mongoose对象。
- views:所有视图文件。 就我而言,我使用.ejs模板,因为它与我的视图概念更相关。 下一步是玉。
我大约需要30分钟来开发API部分。 验证API请求很简单,到目前为止,我使用猫鼬,当验证失败时,我只返回猫鼬错误,因此它的工作非常简单。
另外,express确实对API友好。 工作的大部分是获取数据,将其用于猫鼬对象,然后返回诸如return res.status(500).send(err) 或res.status(200).jsonp(object)之类的内容 。 简单的API函数文件应该是70到100行代码,即使像我这样的菜鸟也很容易看到和维护。
Web部件有点复杂,因为我想在不事先阅读的情况下使用Angular。 当我决定放弃Angular并使用纯HTML和POST / GET请求时,大约花了3个小时才使它们全部运行。 再次,确实很容易做到。
结论和建议
大约4天的工作时间,还活着! 我当前的代码很烂,很脏,需要全面检查。 但这有效,由于我使用它的时间以及我的知识不足,这真是太神奇了。
一旦您了解了NodeJS的基本原理,我真的可以解释给谁开发NodeJS带来了很多乐趣和轻松。 另外,它在简单的VPS上运行得很好。 简单测试表明,它可以处理数千个DNS请求,而无需在廉价VPS上加载任何内容
即使这样,您也应该注意以下事项:
- 您必须非常清楚地了解和了解事件如何工作,NodeJS如何使用CPU时间以及为什么这是如此重要。
- 在编写一些常见功能之前,请先尝试查找库。 NodeJS拥有数十亿个可以帮助您的图书馆。
- NodeJS上的任何库都有自己的API和文档,请仔细阅读。 它既复杂又无聊,但是您可以避免花费数小时进行调试。
- 做快点。 避免使用“我要使用该库/框架或Watever”。 请,简单。 使用纯mongodb命令而不是Mongoose等。
- 不要害怕使用很多线程函数。 是的,您的代码看起来并不“专家”,但是可以避免出现问题。 一旦工作正常,就该清理它了。
- 始终从尽可能少的功能开始,然后慢慢增长。
NodeJS是有史以来最好的语言吗?
这要看情况。 你想干什么 ? 一个简单的MVP? 像Facebook这样的复杂网络项目?
NodeJS似乎非常易于使用,但是如果您不真正了解它,可能会很头疼。 另外,您总是需要VPS才能运行您的应用程序,而且这对任何人都不开放。 直到现在我都找不到一个好的“共享NodeJS托管”(也许是时候对“共享NodeJS托管;-)做出MVP了。 NodeJS上的代码是JavaScript中的代码,而JavaScript吸引了很多人。 最后但并非最不重要的一点是,NodeJS中要做的事情比PHP之类的语言所完全支持的事情要复杂得多。
像往常一样,所有语言或平台都有好事和坏事,我现在确定NodeJS并不是“一切的解决方案”。 但是它是如此酷,您应该知道它。
而且,就目前而言,我真的很喜欢它。