欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node.js API詳解之 vm模塊用法實(shí)例分析

 更新時間:2020年05月27日 08:40:29   作者:李小強(qiáng)  
這篇文章主要介紹了Node.js API詳解之 vm模塊用法,結(jié)合實(shí)例形式分析了Node.js API中vm模塊基本功能、函數(shù)、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Node.js API詳解之 vm模塊用法。分享給大家供大家參考,具體如下:

Node.js API詳解之 vm

vm 模塊提供了一系列 API 用于在 V8 虛擬機(jī)環(huán)境中編譯和運(yùn)行代碼。
JavaScript 代碼可以被編譯并立即運(yùn)行,或編譯、保存然后再運(yùn)行。
常見的用法是在沙盒中運(yùn)行代碼。沙盒代碼使用不同的V8上下文。

const vm = require('vm');
const x = 1;
const sandbox = { x: 2 };
vm.createContext(sandbox); // Contextify the sandbox.
const code = 'x += 40; var y = 17;';
// x and y are global variables in the sandboxed environment.
// Initially, x has the value 2 because that is the value of sandbox.x.
vm.runInContext(code, sandbox);
console.log(sandbox.x); // 42
console.log(sandbox.y); // 17
console.log(x); // 1; y is not defined.

注意: vm模塊并不是實(shí)現(xiàn)代碼安全性的一套機(jī)制。 絕不要試圖用其運(yùn)行未經(jīng)信任的代碼.

vm.createContext([sandbox])

說明:

vm.createContext()主要是用于創(chuàng)建一個能運(yùn)行多個腳本的sandbox。
比如說,在模擬一個網(wǎng)頁瀏覽器時,此方法可以被用于創(chuàng)建一個單獨(dú)的sandbox來代表一個窗口的全局對象,然后所有的script標(biāo)簽都可以在這個sandbox的上下文中運(yùn)行。
給定一個sandbox對象, vm.createContext()會設(shè)置此sandbox,
從而讓它具備在vm.runInContext()或者script.runInContext()中被使用的能力。
如果未提供sandbox(或者傳入undefined),那么會返回一個全新的,空的,上下文隔離化后的sandbox對象。
對于此方法中所調(diào)用的腳本,他們的全局對象不僅擁有我們提供的sandbox對象的所有屬性,同時還有任何global object所擁有的屬性。
對于這些腳本之外的所有代碼,他們的全局變量將保持不變。

demo:

const util = require('util');
const vm = require('vm');
global.globalVar = 3;
const sandbox = { globalVar: 1 };
vm.createContext(sandbox);
vm.runInContext('globalVar *= 2;', sandbox);
console.log(util.inspect(sandbox)); // { globalVar: 2 }
console.log(util.inspect(globalVar)); // 3

vm.isContext(sandbox)

說明:

當(dāng)給定的sandbox對象已經(jīng)被vm.createContext()上下文隔離化,則返回真。

demo:

const util = require('util');
const vm = require('vm');
global.globalVar = 3;
const sandbox = { globalVar: 1 };
vm.createContext(sandbox);
console.log(vm.isContext(sandbox));
// true

vm.runInContext(code, contextifiedSandbox[, options])

說明:

code:將被編譯和運(yùn)行的JavaScript代碼
contextifiedSandbox:一個被上下文隔離化過的對象,會在代碼被編譯和執(zhí)行之后充當(dāng)global對象
options:
filename:定義供腳本生成的堆棧跟蹤信息所使用的文件名
lineOffset:定義腳本生成的堆棧跟蹤信息所顯示的行號偏移
columnOffset:定義腳本生成的堆棧跟蹤信息所顯示的列號偏移
displayErrors:當(dāng)值為真的時候,假如在解析代碼的時候發(fā)生錯誤Error,引起錯誤的行將會被加入堆棧跟蹤信息
timeout:定義在被終止執(zhí)行之前此code被允許執(zhí)行的最大毫秒數(shù)。假如執(zhí)行被終止,將會拋出一個錯誤Error
vm.runInContext()在指定的contextifiedSandbox的上下文里執(zhí)行vm.Script對象中被編譯后的代碼并返回其結(jié)果。
被執(zhí)行的代碼無法獲取本地作用域。contextifiedSandbox必須是事先被vm.createContext()上下文隔離化過的對象。

demo:

const util = require('util');
const vm = require('vm');
global.globalVar = 3;
const sandbox = { globalVar: 1 };
vm.createContext(sandbox);
vm.runInContext('globalVar *= 2;', sandbox);
console.log(util.inspect(sandbox)); 
// { globalVar: 2 }

vm.runInDebugContext(code)(已廢棄)

說明:

vm.runInDebugContext()會在V8的調(diào)試上下文中編譯并執(zhí)行code。此方法主要在需要獲取V8Debug對象的時候使用。
注意: 調(diào)試上下文和對象從本質(zhì)而言是從屬于V8調(diào)試器的,故有可能會在沒有事先警告的情況下被改變(甚至被移除)
Debug對象另外還可以通過特定于V8的–expose_debug_as命令行選項(xiàng)獲得。

demo:

const vm = require('vm')
const Debug = vm.runInDebugContext('Debug');
console.log(Debug.findScript(process.emit).name); // 'events.js'
console.log(Debug.findScript(process.exit).name); // 'internal/process.js'

vm.runInNewContext(code[, sandbox][, options])

說明:

首先給指定的sandbox(若為undefined,則會新建一個sandbox)提供一個隔離的上下文,
再在此上下文中執(zhí)行vm.Script中被編譯的代碼,最后返回結(jié)果。運(yùn)行中的代碼無法獲取本地作用域。

demo:

const util = require('util');
const vm = require('vm');
const sandbox = {
 animal: 'cat',
 count: 2
};
vm.runInNewContext('count += 1; name = "kitty"', sandbox);
console.log(util.inspect(sandbox));
// { animal: 'cat', count: 3, name: 'kitty' }

vm.runInThisContext(code[, options])

說明:

vm.runInThisContext()在當(dāng)前的global對象的上下文中編譯并執(zhí)行code,最后返回結(jié)果。
運(yùn)行中的代碼無法獲取本地作用域,但可以獲取當(dāng)前的global對象。

demo:

const vm = require('vm');
let localVar = 'initial value';
const vmResult = vm.runInThisContext('localVar = "vm";');
console.log('vmResult:', vmResult);
console.log('localVar:', localVar);
const evalResult = eval('localVar = "eval";');
console.log('evalResult:', evalResult);
console.log('localVar:', localVar);
// vmResult: 'vm', localVar: 'initial value'
// evalResult: 'eval', localVar: 'eval'

vm.Script 類

說明:

vm.Script類型的實(shí)例包含若干預(yù)編譯的腳本,這些腳本能夠在特定的沙箱(或者上下文)中被運(yùn)行。

new vm.Script(code, options)

說明:

創(chuàng)建一個新的vm.Script對象只編譯代碼但不會執(zhí)行它。編譯過的vm.Script此后可以被多次執(zhí)行。
值得注意的是,code是不綁定于任何全局對象的,相反,它僅僅綁定于每次執(zhí)行它的對象。
code:要被解析的JavaScript代碼
options:
filename:定義供腳本生成的堆棧跟蹤信息所使用的文件名
lineOffset:定義腳本生成的堆棧跟蹤信息所顯示的行號偏移
columnOffset:定義腳本生成的堆棧跟蹤信息所顯示的列號偏移
displayErrors:當(dāng)值為真的時候,假如在解析代碼的時候發(fā)生錯誤Error,引起錯誤的行將會被加入堆棧跟蹤信息
timeout:定義在被終止執(zhí)行之前此code被允許執(zhí)行的最大毫秒數(shù)。假如執(zhí)行被終止,將會拋出一個錯誤[Error][]。
cachedData:為源碼提供一個可選的存有v8代碼緩存數(shù)據(jù)的Buffer。一旦提供了此Buffer,取決于v8引擎對Buffer中數(shù)據(jù)的接受狀況,cachedDataRejected值將會被設(shè)為要么 真要么為假。
produceCachedData:當(dāng)值為真且cachedData不存在的時候,v8將會試圖為code生成代碼緩存數(shù)據(jù)。一旦成功,一個有V8代碼緩存數(shù)據(jù)的Buffer將會被生成和儲存在vm.Script返回的實(shí)例的cachedData屬性里。 取決于代碼緩存數(shù)據(jù)是否被成功生成,cachedDataProduced的值會被設(shè)置為true或者false。

demo:

const util = require('util');
const vm = require('vm');
const sandbox = {
 animal: 'cat',
 count: 2
};
const script = new vm.Script('count += 1; name = "kitty";');
const context = vm.createContext(sandbox);
script.runInContext(context);
console.log(util.inspect(sandbox));
// { animal: 'cat', count: 3, name: 'kitty' }

script.runInContext(contextifiedSandbox[, options])

說明:

在指定的contextifiedSandbox中執(zhí)行vm.Script對象中被編譯后的代碼并返回其結(jié)果。
被執(zhí)行的代碼無法獲取本地作用域。
contextifiedSandbox:由vm.createContext()返回的[contextified][]對象

demo:

const util = require('util');
const vm = require('vm');
const sandbox = {
 animal: 'cat',
 count: 2
};
const script = new vm.Script('count += 1; name = "kitty";');
const context = vm.createContext(sandbox);
for (let i = 0; i < 10; ++i) {
 script.runInContext(context);
}
console.log(util.inspect(sandbox));
// { animal: 'cat', count: 12, name: 'kitty' }

script.runInNewContext([sandbox[, options]])

說明:

首先給指定的sandbox提供一個隔離的上下文, 再在此上下文中執(zhí)行vm.Script中被編譯的代碼,最后返回結(jié)果。
運(yùn)行中的代碼無法獲取本地作用域。

demo:

const util = require('util');
const vm = require('vm');
const script = new vm.Script('globalVar = "set"');
const sandboxes = [{}, {}, {}];
sandboxes.forEach((sandbox) => {
 script.runInNewContext(sandbox);
});
console.log(util.inspect(sandboxes));
// [{ globalVar: 'set' }, { globalVar: 'set' }, { globalVar: 'set' }]

script.runInThisContext([options])

說明:

在指定的global對象的上下文中執(zhí)行vm.Script對象里被編譯的代碼并返回其結(jié)果。
被執(zhí)行的代碼雖然無法獲取本地作用域,但是能獲取global對象。

demo:

const vm = require('vm');
global.globalVar = 0;
const script = new vm.Script('globalVar += 1');
for (let i = 0; i < 1000; ++i) {
 script.runInThisContext();
}
console.log(globalVar);
// 1000

例子:在vm中運(yùn)行一個http server

'use strict';
const vm = require('vm');
const code = `
(function(require) {
 const http = require('http');
 http.createServer((request, response) => {
  response.writeHead(200, { 'Content-Type': 'text/plain' });
  response.end('Hello World\\n');
 }).listen(8124);
 console.log('Server running at http://127.0.0.1:8124/');
})`;
vm.runInThisContext(code)(require);

希望本文所述對大家node.js程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Node.js中fs模塊的使用方法

    Node.js中fs模塊的使用方法

    這篇文章介紹了Node.js中fs模塊的使用方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Node.js 使用axios讀寫influxDB的方法示例

    Node.js 使用axios讀寫influxDB的方法示例

    這篇文章主要介紹了Node.js 使用axios讀寫influxDB的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • 深入解析nodejs HTTP服務(wù)

    深入解析nodejs HTTP服務(wù)

    本篇文章主要介紹了深入解析nodejs HTTP服務(wù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 了不起的node.js讀書筆記之node.js中的特性

    了不起的node.js讀書筆記之node.js中的特性

    這篇文章主要介紹了了不起的node.js讀書筆記之node.js中的特性,需要的朋友可以參考下
    2014-12-12
  • 淺析Node.js實(shí)用的內(nèi)置API

    淺析Node.js實(shí)用的內(nèi)置API

    這篇文章主要介紹了Node.js實(shí)用的內(nèi)置API,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Nodejs+express+html5 實(shí)現(xiàn)拖拽上傳

    Nodejs+express+html5 實(shí)現(xiàn)拖拽上傳

    文件上傳是一個比較常見的功能,傳統(tǒng)的選擇方式的上傳比較麻煩,需要先點(diǎn)擊上傳按鈕,然后再找到文件的路徑,然后上傳。給用戶體驗(yàn)帶來很大問題。html5開始支持拖拽上傳的需要的api。nodejs也是一個最近越來越流行的技術(shù),這也是自己第一次接觸nodejs。
    2014-08-08
  • 快速掌握Node.js模塊封裝及使用

    快速掌握Node.js模塊封裝及使用

    這篇文章主要為大家詳細(xì)介紹了Node.js模塊封裝及使用,幫助大家快速掌握Node.js模塊封裝及使用,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 在NodeJS中啟用ECMAScript 6小結(jié)(windos以及Linux)

    在NodeJS中啟用ECMAScript 6小結(jié)(windos以及Linux)

    ECMAScript 6 是JavaScript的下一代標(biāo)準(zhǔn),其目標(biāo),是使得JavaScript可以用來編寫復(fù)雜的應(yīng)用程序、函數(shù)庫和代碼的自動生成器(code generator)。
    2014-07-07
  • NodeJS開發(fā)人員常見五個錯誤理解

    NodeJS開發(fā)人員常見五個錯誤理解

    這篇文章主要介紹了NodeJS開發(fā)人員常見五個錯誤理解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 解決node.js含有%百分號時發(fā)送get請求時瀏覽器地址自動編碼的問題

    解決node.js含有%百分號時發(fā)送get請求時瀏覽器地址自動編碼的問題

    這篇文章主要介紹了解決node.js含有%百分號時發(fā)送get請求時瀏覽器地址自動編碼的問題,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評論