码迷,mamicode.com
首页 > 其他好文 > 详细

readline和vm模块的应用

时间:2016-01-08 23:25:37      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

readline用于创建一个从stream读取数据的接口

VM提供了在应用中执行脚本的能力

vm+readline 实现各简单的js执行命令行工具

开发环境 : Node4.2.4 , 用了ES6 arrow function /let/const

调试cmder

‘use strict‘

const readline = require(‘readline‘);
const vm = require(‘vm‘);

//创建接口
let rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.setPrompt("V+>");
rl.prompt();

rl.on( ‘line‘, (data) => {
    let script = data.trim();

    if( script === ‘exit‘){
        rl.close();
        return ;
    }

    //如果想在新的运行上下文执行脚本使用runInNewContext
    //使用runInThisContext意味脚本可以直接访问当前上下文全局变量global
    //这种内部执行脚本是极其不安全的
    vm.runInThisContext(script);

    rl.prompt();
});

rl.on(‘close‘, () => {
    console.log(‘Bye, Bye !‘);
    process.exit(0);
});

需要关注的vm提供的几个方法:

runInThisContext 在当前上下文执行,可以访问当前global但是无法访问本地变量

runInNewContext 在一个新的容器环境中执行,无法访问当前上下文任何数据

演示runInNewContext的应用

‘use strict‘

const readline = require(‘readline‘);
const vm = require(‘vm‘);

// 创建一个容器或者叫沙箱,可以提供一些变量或者方法
// 用于在脚本的范围
const contaner = {};

contaner.log = console.log;

//创建接口
let rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.setPrompt("V+>");
rl.prompt();

rl.on( ‘line‘, (data) => {
    let script = data.trim();

    if( script === ‘exit‘){
        rl.close();
        return ;
    }

    //如果想在新的运行上下文执行脚本使用runInNewContext
    //使用runInThisContext意味脚本可以直接访问当前上下文全局变量global
    //这种内部执行脚本是极其不安全的
    //vm.runInThisContext(script);
    vm.runInNewContext(script, contaner);//例如script: log(‘visonme‘) =>输出visonme

    rl.prompt();
});

rl.on(‘close‘, () => {
    console.log(‘Bye, Bye !‘);
    process.exit(0);
});

如果你想提供用于script访问的变量可以这样修改contaner

const container = {
    accessName : ‘visonme‘, //脚本可以直接访问accessName变量
    console:{
        log: console.log , //在脚本中提供类似console.log的输出
        error: console.error
    }

};

//假如你想提供自定义的方法用于脚本访问可以这样

let myFunction = () => {
    console.log("this is myFunction");
};

const container = {
    Fn : myFunction  //提供Fn用于脚本访问myfunction
}

 

readline和vm模块的应用

标签:

原文地址:http://www.cnblogs.com/visonme/p/5114998.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!