nodejs 服务启动时遇到了有问题的 js 文件,如何不让整个服务挂掉? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
inkWave

nodejs 服务启动时遇到了有问题的 js 文件,如何不让整个服务挂掉?

  •  
  •   inkWave 2018 年 3 月 16 日 6065 次点击
    这是一个创建于 2962 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在用基于 nodejs 开发的 hubot 做可配置的聊天机器人.领导要求用户前端提交 js 代码,后端生成 js 文件,然后 hubot 服务端加载生成的 js 文件来达到自定义响应的目的.但是我在开发的时候遇到了这个问题,如果提交过来的 js 代码有问题,服务端加载这个 js 文件会导致整个服务挂掉.我想到的解决方法有两种:一种是对提交过来的 js 代码做校验.这部分我做了校验括号的,不知道怎么校验类似于 if 没写 i 这种错误.还有一种就是启动服务的时候,遇到有问题的 js 文件不让服务端挂掉,但是这部分不知道该怎么实现. 希望大家能指点一下我,多谢多谢

    15 条回复    2018-03-16 14:01:17 +08:00
    3IOhG7M0knRu5UlC
        1
    3IOhG7M0knRu5UlC  
       2018 年 3 月 16 日 via Android
    写的 J's 在浏览器上先跑一下?
    inkWave
        2
    inkWave  
    OP
       2018 年 3 月 16 日
    @GooMS node.js 的代码,浏览器也能跑的吗?
    leekafai
        3
    leekafai  
       2018 年 3 月 16 日   1
    感觉相当于代码批改一样。
    一般是对照输入与预期输出。
    但是最好是隔绝运行一次,类似的有各种代码学习网站的在线编译。
    https://github.com/mattgodbolt/compiler-explorer
    https://www.bytelang.com/
    inkWave
        4
    inkWave  
    OP
       2018 年 3 月 16 日
    @leekafai 第一个 github 我刚也搜到啦,正在看.多谢~
    skyadmin
        5
    skyadmin  
       2018 年 3 月 16 日   1
    pm2 了解一下
    inkWave
        6
    inkWave  
    OP
       2018 年 3 月 16 日
    @skyadmin 好的,多谢~
    xiaody
        7
    xiaody      2018 年 3 月 16 日
    node --check input.js 这样?不过用户的输入不应该在沙箱里跑么,不应该在服务主进程环境执行呀。
    airyland
        8
    airyland  
       2018 年 3 月 16 日
    先尝试生成 AST 语法树,再过一遍 eslint,有错误应该都能发现。启动服务时不加载相应 js,响应时加载呢,外围加 try catch 若有错误可以 catch 到并不会导致崩溃,如果正常加载了下次再 required 其实是缓存了。
    airyland
        9
    airyland  
       2018 年 3 月 16 日
    也可以开启另一个服务专门加载 js 并执行,当前服务可以通过各种方式去请求返回数据。如果没有人工审核,其实限制不了用户提交的恶意代码产生的破坏。
    VDimos
        10
    VDimos  
       2018 年 3 月 16 日 via Android
    直接捕获错误,然后重启服务不就行了? request 事件的都 try catch 呗
    inkWave
        11
    inkWave  
    OP
       2018 年 3 月 16 日
    @VDimos 我对 nodejs 这块不是很熟悉,而且也不清楚这个 hubot 是怎么加载 js 文件的,所以这个错误不知道怎么 try catch.
    viko16
        12
    viko16  
       2018 年 3 月 16 日
    zythum
        13
    zythum  
       2018 年 3 月 16 日
    1. 用 vm 控制他可以使用的全局变量,
    2. 让他的代码同步执行不许异步
    3. 外层 try catch 捕获错误

    用以上方法让他的代码用上面的方式在一个子进程里面执行。监控这个子进程运行状态(时长,cpu,内存消耗)玩意有啥问题直接 kill 掉。他代码运行结束进程间把结果通信回来。
    cctv1005s927
        14
    cctv1005s927  
       2018 年 3 月 16 日
    eval 一下?
    try catch

    不合适就报错,就不要执行了
    cctv1005s927
        15
    cctv1005s927  
       2018 年 3 月 16 日
    @cctv1005s927 当然我觉得用 child_process + 沙箱 的环境跑一下是最放心的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2611 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 78ms UTC 10:51 PVG 18:51 LAX 03:51 JFK 06:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86