vm-node
TypeScript icon, indicating that this package has built-in type declarations

0.0.21 • Public • Published

简介

vm-node 是一款Node端代码沙箱,在vm2的基础上,额外解决了代码死循环、各类异常捕获等问题,沙箱内能共享所处运行环境的node_module中已安装的包

案例演示

const {createVM} = require('vm-node');
const vm = createVM({timeout: 30000})
// 或
const vm = createVM() // 默认超时时长:10s

// 正常使用1
vm.run('hooks.onFinished({name: "andy"})').then((data) => {
  console.log(data) // {name: "andy"}
})
// 正常使用2
vm.run(`
  const axios = require('axios');
  const wrapper = async () => {
    try {
      const res = await axios.get("http://localhost:8080/api/test");
      // 将结果传递至外部,并标记执行结束
      hooks.onFinished(res.data)
    } catch(e) {
      logger.log('出错了')
      logger.log(e.message)
    }
  }
  wrapper()
`).then(data => {
  console.log('沙箱执行结果是', data)
})

// 捕获内部错误1
vm.run('logger.log(a)').catch(e => {
  console.log('外部收到错误', e)
})
// 捕获内部错误2
vm.run(`Promise.reject('这是Promise错误信息')`).catch(e => {
  console.log('外部收到错误', e)
})
// 捕获内部错误3
vm.run('process.exit()').catch(e => {
  console.log('外部收到错误', e)
})

createVM

  • timeout: 沙箱代码超时配置
  • openLog: 是否开启log开关,开启则会将中间日志全部输出

内置全局变量

  • logger: 打印日志相关,涵盖了 log、info、warn、error
  • hooks:沙箱运行的生命周期钩子
    • onFinished: 沙箱执行结束,可以将内部数据传递至外部
    • onError:沙箱执行出错,会直接结束程序

Tips

  • 沙箱中的代码如果使用了外部依赖,请确保沙箱运行的外部环境有此依赖
  • 如果需要将沙箱中运行的结果传递至外部,请调用 hooks.onFinished 方法进行传递

/vm-node/

    Package Sidebar

    Install

    npm i vm-node

    Weekly Downloads

    0

    Version

    0.0.21

    License

    none

    Unpacked Size

    20.7 kB

    Total Files

    8

    Last publish

    Collaborators

    • andyzou
    • leo306