首页 文章 精选 留言 我的

精选列表

搜索[nodejs],共1638篇文章
优秀的个人博客,低调大师

前端工程师最好的全栈开发实践-设计开发属于自己的nodejs博客

我本是一名文科专业半路出家的前端开发人员,从最初只会切图和写CSS、Html到现在会写点JS,一路坑坑洼洼,也是经历了很多,从2010年开始就用WordPress开设了自己的博客,虽然内容零零散散的并不多,但是多多少少也留下了时光的缩影,一直希望自己有一个自留地。用Node.js做服务端替换WordPress是去年的一个想法,由于一直腾不出时间,所以拖到了现在。当然了WordPress作为全球用户量最广的开源博客程序,易用性等诸多好处无可厚非,光自己的博客在过去几年就用了很多套模板,也用它做过很多不同风格不同功能的网站, 也许Node.js不是个人博客的最好的开发语言选择,不管是情怀还是其他,我相信一定有前端开发人员跟我一样有想过这样的尝试。市面上开源的博客程序很多,UI模板也相当漂亮,但是自己开发一个属于自己的博客程序,没事的时候折腾折腾,可能会是一件比较美好的事情,最主要的目的是在其折腾的过程中,可以多尝试服务端的功能开发,这对从一个纯前端转向全栈开发工程师是非常好的实践。 git上面有很多开源的Node.js源码,教程也比较详细,有的功能全面,有的相对简约,当然每个人只要选择适合自己的就好,下面简单介绍下我的项目,从技术角度而言,深度有限,大神多提意见。 架构 项目沿用传统的MVC,比较古老的架构,model(对象模型),view(视图),controller(控制器),model通俗的说就是数据库表字段的映射,view就是界面,UI,controller就是操作数据库,一般是接收到路由信息,然后对数据库进行操作,再把数据返回给view层。如果是熟悉后端的开发人员可能一眼就看的懂,不过对于没有做过后端开发的纯前端人员来说,可能需要一些时间去消化。想起我第一次做全栈开发,一个存储CCTV配置数据的项目,基于c#和sqlserver,也是标准的MVC架构,很简单的增删改查,是废了不少功夫。 数据库 数据库这块用的MongoDB,为什么用它,因为简单好用,再就是它是在非关系数据中功能最丰富,最像关系数据库的。操作数据库的工具用了mongoose,api易读,很容易上手。之前是wordpress用的mysql,导出数据到MongdoDB确实没什么特别的好的方法和工具,尝试用了一些工具和脚本,效率不高,最后还是手工完成的,好在本人比较懒,那么多年没几篇内容。 WEB框架和模板 后端用了Express的web框架,页面渲染部分是handlebars模板,个人感觉{{}}大括号的写法比较适合前端开发人员,但是handlebars模板是个弱逻辑语言,有一些不方便,需要helper,特别是分页和评论,逻辑特别复杂,不过如果你喜欢hb模板,可以去git上下helper的库。jade模板(现在改成pug了)会比较方便一些,对一些复杂逻辑的处理比较高效,主要是可以直接在模板中写js语法,但是缩进的写法不是每个前端开发都能习惯的。 前端 如今的前后端分离,MV*框架,工程化,模块化,这些概念大行其道,如果一个做前端的不知道这几个概念,恐怕工作都难找到。但是这个项目没有前后端分离,直接在后端渲染页面,也没有用MVVM框架,工程化和模块化就更不用说了,后台页面用了一个jQuery和BootStrap和一些插件,前台页面好像就一个jQuery,CSS基本手写,我相信前端开发人员看到会比较亲切。我的初衷是希望通过这个项目了解更多后端开发思路和模式,其次个人博客是个传播源,在后端渲染也是为了利于SEO。 原理 我这里简单从一个页面打开到完全加载,程序做了哪些事去论述一下整个项目工作原理,当你打开博客的一个页面,node.js在后端通过路由机制(express提供的路由模块)去匹配到这个页面的url,然后查找对应的controller(就是处理这个URL的函数),在这个controller函数中,对数据库进行一些过滤筛选(用mongoose对数据库进行操作)最终拿到页面需要的数据,然后再把数据传递给对应的模板(handlebars),最终渲染成HTML。 由于时间仓促,博客的功能可能比较简陋,但是基本的功能已经满足了,另外项目也有很多没用到的函数和接口,来不及整理,留待以后扩展吧。博客demo 这是我的博客git地址github.com/frogo/blog,欢迎大家star和fork, Screenshot 原文发布时间:2018年06月29日 原文作者:frogo 本文来源 掘金,如需转载请紧急联系作者

优秀的个人博客,低调大师

nodejs在pm2下使用log4js cluster模式的日志打印丢失问题

我使用pm2的cluster集群模式管理node服务,使用log4js打印日志。最近公司业务量上升,与此同时问题订单也随之增多。但多次在排查异常订单时找不到订单的正常日志,在基本排除程序本身问题后我将目光投在了日志打印插件log4js身上。 1:这是我目前的log4js的配置 log4js.configure({ appenders: { out: { type: 'stdout' }, info: { type: 'dateFile', filename: 'info', pattern: '-yyyy-MM-dd.log', layout: { type: 'pattern', pattern: '%d{yyyy-MM-ddThh:mm:ss.SSSO} %p %c - [%m]' } }, }, categories: { default: { appenders: ['out','info'], level: 'all' }, }, pm2: true, disableClustering: true }); 我在网上也找到了很多博客,看到很多人都是这么写的。这么写可以解决cluster集群模式下只有一个进程输出的问题。但是在翻了log4js的源码之后我发现,如果设置了disableClustering为true之后,每个cluster进程都会单独向文件输出日志。 log4js.configure()配置的源码如下: 当你设置了disableClustering为true时log4js会做如上处理。然后当你getLogger时: 执行getLogger()函数时,会执行isMaster()方法,判断当前进程是不是主进程。isMaster函数执行时,如果disableClustering为true的话则认为当前进程是主进程。则会将sendLogEventToAppender作为打印日志时的执行函数。真正将日志打印到文件中。这个函数的具体执行大家可以自己去看下源码。里面逻辑很简单,就不再赘述。 这样就会发生多个进程同时向一个文件写入的情况,在某种情况下就会出现日志丢失情况。 我司遇到的问题就是在这种情况下发生的。而且官方文档也有提到这种模式会发生一些莫名其妙的问题(说的应该就是日志丢失吧)。log4js官方文档 好。到了这里,我们的node程序在pm2的cluster模式在使用log4js丢日志的原因基本是确定了。就是disableClustering的锅。那我们就要去解决它,怎么解决? 1:将disableClustering去掉。在配置中将disableClustering去掉之后,运行4个进程后发现,只有一个进程能正常打印日志,其它三个进程日志全部丢失。继续看官方文档发现下面一段话。 在log4js的配置中设置pm2为true时需要下载pm2-intercom参加才能保持日志的正常打印。ok,下载pm2-intercom。使用ab发起10个并发请求,打印结果如下。 ok。看起来一起完美。你以为结束了?当然不可能。 按照当前设置将服务发到测试环境,一跑,同样的代码,同样的设置,同样发起10个请求,只有3个打印出来了。试了好几次都是这样。so,还是在丢日志。 为什么呢?不可能啊!是不是电脑有问题?是不是pm2版本问题?是不是Node版本问题?是不是Log4js版本问题?在各种尝试了n次,将所有环境全部统一之后我发现,还是这样。so,老老实实看源码吧。 前面的一堆就不再说了,直接到关键代码。log4js下打印日志会有可能有两条路径。如下: pm2下使用cluster模式时,其实所有的进程都是cluster,只有pm2主进程是master进程。但是pm2内部对进程做了标志。例如,启动4个cluster进程,则会有一个标志字段(默认是NODE_APP_INSTANCE)记录它的内部标志, 0、1、2、3。当标志位为0时,log4js就认为它是主进程(通过isPM2Master函数)。则此时master进程负责执行sendLogEventToAppender函数打印日志,cluster进程负责执行workerDispatch将日志发送给主进程(其实这时发送给的是pm2主进程)。 到了这里我们可以看到的结果就是,如果是cluster进程,则日志会发送给master进程,现在让我们来看pm2-intercom插件。我先是在github上找了一下它的源码发现没找到,后来问了log4js的官方人员后得到的结果是源码丢了!源码丢了!丢了! 原因不知道,结果就是找不到了。。issues地址 后来找到了一份貌似是第三方的pm2-intercom源码。pm2-intercom源码找到源码看了一下。发现pm2-intercom会通过pm2的api连接到pm2,并接收到所有的消息: 上面是pm2官方的文档pm2文档。pm2-intercom接收消息代码如下: 通过打印日志发现,所有cluster进程发送的消息都会被pm2-intercom接收。然后通过pm2-intercom转发出去。如下: 然后我发现在执行async.forEachLimit函数往别的进程广播时因为设置了4,所有最后执行下来。只会想pm2 list列表中的前4个进程推送消息,所有往后的进程都接收不到。 此时! 终于找到了为什么我在本地调试时为什么能接收到消息,而到了测试环境就不行。因为测试环境跑了很多服务。我的程序远在4之外。 此时,问题的原因已经找到了。通过在async.forEachLimit函数里面加上next()函数执行,发现果然所有的进程都能接收到消息。测试环境也已经可以接收到消息。 但是,这种方式有几个弊端: 1:所有的进程都能接收到消息,所有的主进程都会打印日志,所有可能你的日志会在不同的程序之间串。 2:往所有的进程发送日志,很没有效率。 所以最好可以根据自己的需求往特定的进程发送消息。 如你有一个进程专门记录日志,则可以都往那一个上面发。或者每个程序的master进程记录日志,则可以使用packet中的name来进行区分做分发。具体的实现可以自行定义。 至此,多进程打印日志的问题算是找到了。我也将修改代码发布到线上观察后续的结果。希望能解决问题。哈哈。 谨以此篇记录我踩的这些坑,如有错漏欢迎指教。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。