Как использовать изолированную программную среду nodejs vm2 с механизмом наследования? - PullRequest
0 голосов
/ 12 февраля 2019

Я получил запрос на сервер nodejs.Данные, поступающие в этот сервис, являются объектом транзакции следующим образом.

{ "_id": "5c2f3e4c5f627d785086d0f7", "action_time": 1546600012970, "amount": -0.164, "asset": "SKK", "complete_time": 1546600012970, "confirm_rate": 100, "desc": "15901 nolu işlem ücreti", "fee": "", "fee_asset": "", "group": 15901, "hash": "cd2105320da97800a9d65aa90f55e755d16e9bb48f4f831a15b1ff5f95b902e2", "nonce": "", "prev_hash": "7f35b213e044109d676788043763e2cb48c35d1da887d4624813410090474d82", "seq": 15903, "status": 1, "subtype": 3, "to": "SKK19FiKEtunucWqLjNXtnDH479mzkRrD1DEr", "type": 1, "wallet": "SKK1PVTXzG15vwQX9U6c4si8iVsFRgkV2RAAg", "isSmartCOntract": 1, "smartContractId": 123456 }

Это процесс интеллектуального контракта, если поле smart_contract_id этого объекта заполнено.И эта информация умного контракта id считывается из базы данных как сценарий javascript.Этот файл javascript содержит различные функции. Этот файл javascript должен быть запущен сервером и возвращен. Каждое интеллектуальное соглашение имеет различное содержимое. Я подумал, что было бы правильно использовать песочницу nodejs vm2 для выполнения этой задачи.

Но для сервера было бы плохо запускать сценарий непосредственно из этой базы данных. Я подумал, что для этого требования было бы точнее использовать наследование в javascript.

Коды, которые я написали ошибка, которую я получил, показана ниже.

main.js (суперкласс)

    var fs = require('fs')
const { NodeVM } = require('vm2');

class Animal {

    constructor(name) {
        this.speed = 0;
        this.name = name;
    }

    run(speed) {
        this.speed += speed;
        console.log(`${this.name} runs with speed ${this.speed}.`);
    }
    stop() {
        this.speed = 0;
        console.log(`${this.name} stopped.`);
    }
}

let tx = { "_id": "5c2f3e4c5f627d785086d0f7", "action_time": 1546600012970, "amount": -0.164, "asset": "SKK", "complete_time": 1546600012970, "confirm_rate": 100, "desc": "15901 nolu işlem ücreti", "fee": "", "fee_asset": "", "group": 15901, "hash": "cd2105320da97800a9d65aa90f55e755d16e9bb48f4f831a15b1ff5f95b902e2", "nonce": "", "prev_hash": "7f35b213e044109d676788043763e2cb48c35d1da887d4624813410090474d82", "seq": 15903, "status": 1, "subtype": 3, "to": "SKK19FiKEtunucWqLjNXtnDH479mzkRrD1DEr", "type": 1, "wallet": "SKK1PVTXzG15vwQX9U6c4si8iVsFRgkV2RAAg", "isSmartCOntract": 1, "smartContractId": 123456 };
if (tx.isSmartContract) {

}
const sandbox = {
    object: Animal.prototype,
    tx: tx
}

const vm = new NodeVM({
    console: 'inherit',
    sandbox: { tx, Animal },
    require: {
        external: true,
        builtin: ['*'],
        root: "./",
        mock: {
        }
    }
});

/*
var scriptContent = fs.readFileSync('./sampleOne.js');
vm.run(scriptContent, 'sampleOne.js');
*/

vm.run(`

class Rabbit extends Animal {

    constructor(name) {
    super(name);
    }

    hide() {
        console.log('${this.name} hides!');
    }

    stop() {
        super.stop(); // call parent stop
        this.hide(); // and then hide
    }
}

let rabbit = new Rabbit("White Rabbit");

rabbit.run(5); // White Rabbit runs with speed 5.
rabbit.stop(); // White Rabbit stopped. White rabbit hides!
`, 'vm.js');

ошибка, которую я получил:

C:\nodejs\node-smart-contract\node_modules\vm2\lib\main.js:430
                        throw this._internal.Decontextify.value(e);
                        ^
TypeError: 'get' on proxy: property 'prototype' is a read-only and non-configurable data property on the proxy target but the proxy did not return its actual value (expected '[object Object]' but got '[object Object]')
    at Object.<anonymous> (C:\nodejs\node-smart-contract\vm.js:3:22)
    at NodeVM.run (C:\nodejs\node-smart-contract\node_modules\vm2\lib\main.js:428:23)
    at Object.<anonymous> (C:\nodejs\node-smart-contract\main.js:47:4)
    at Module._compile (internal/modules/cjs/loader.js:688:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:699:10)
    at Module.load (internal/modules/cjs/loader.js:598:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:537:12)
    at Function.Module._load (internal/modules/cjs/loader.js:529:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:741:12)
    at startup (internal/bootstrap/node.js:285:19)
[nodemon] app crashed - waiting for file changes before starting...

Как мне справиться с этой задачей?

...