V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
inkWave
V2EX  ›  Node.js

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

  •  
  •   inkWave · 2018-03-16 10:44:39 +08:00 · 5628 次点击
    这是一个创建于 2447 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    不合适就报错,就不要执行了
    cctv1005s927
        15
    cctv1005s927  
       2018-03-16 14:01:17 +08:00
    @cctv1005s927 当然我觉得用 child_process + 沙箱 的环境跑一下是最放心的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3963 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:57 · PVG 08:57 · LAX 16:57 · JFK 19:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.