VM์์ ์ข ์์ฑ์ ์๊ตฌํ๋ ๋์ ์ด๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ฌํ ํ ์ฝ๋ :
const { NodeVM } = require("vm2");
const vm = new NodeVM({
console: "redirect",
sandbox: {},
require: {
builtin: ["fs"]
},
wrapper: "none"
});
vm.run("const fs = require('fs'); fs.constants");
์ ์ฒด ์คํ ์ถ์ :
node_modules/vm2/lib/main.js:327
throw this._internal.Decontextify.value(e);
^
TypeError: 'get' on proxy: property 'constants' 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> (vm.js:1:91)
at NodeVM.run (node_modules/vm2/lib/main.js:325:27)
at Object.<anonymous> (script.js:12:4)
at Module._compile (module.js:556:32)
at Object.Module._extensions..js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)
at Module.runMain (module.js:590:10)
at run (bootstrap_node.js:394:7)
๋์์ด ๋ ๋งํ ๋ค๋ฅธ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์!
๋ํ ํ๋ก์, ํนํ ์์๊ณผ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๊ฐ ํ๋ก์์ ๊ตฌํ ๋๋ ์ ํ์ผ๋ก ์ธํ ๊ฒ์ธ์ง ํ์คํ์ง ์์ง๋ง ์กฐ์ฌ ํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋ํ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ํ์ฌ ํจํด์ด ์ ๊ด์ฐฎ์ง ์์์ง ์ดํดํ๊ธฐ์๋ ํ๋ก์์ ์ต์ํ์ง ์์ง๋ง Contextify.object.get
์์ ์ฝ๊ธฐ ์ ์ฉ ๊ตฌ์ฑ ๋ถ๊ฐ๋ฅ ์์ฑ์ ๋ํ ์ถ๊ฐ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ์ฌ ์ค๋ฅ๋ฅผ ์ ๊ฑฐ ํ ์์์์ต๋๋ค.
object: function(object, traps, deepTraps, flags, mock) {
const proxy = new host.Proxy(object, host.Object.assign({
get: (target, key, receiver) => {
if (key === 'vmProxyTarget' && DEBUG) return object;
if (key === 'isVMProxy') return true;
if (mock && key in mock) return mock[key];
if (key === 'constructor') return Object;
if (key === '__proto__') return Object.prototype;
// Added code
const config = host.Object.getOwnPropertyDescriptor(object, key);
if (config && config.configurable === false && config.writable === false) {
return object[key];
}
์ด๊ฒ์ get
๊ณ ์ MDN ์ค๋ช
์ ๋ฐ๋ฅด๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋์ ๊ฐ์ฒด ์์ฑ์ด ์ฐ๊ธฐ ๋ฐ ๊ตฌ์ฑ ํ ์์๋ ๋ฐ์ดํฐ ์์ฑ ์ธ ๊ฒฝ์ฐ ์์ฑ์ ๋ํด๋ณด๊ณ ๋ ๊ฐ์ ํด๋น ๋์ ๊ฐ์ฒด ์์ฑ์ ๊ฐ๊ณผ ๋์ผํด์ผํฉ๋๋ค.
ํ์ง๋ง ์๋ ๋ฐ์ฑ์ ๊นจ๋จ๋ฆด ๊ฒ ๊ฐ๋ค์
์์ ์ฝ๋ ๋ณ๊ฒฝ์ ํตํด ๋ฌธ์ ๋ฅผ ์ฐํ ํ ์ ์๋๋กํ์ฌ ๋ก์ปฌ์์๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ํ ๋น ๋ฅธ ์์ ๊ฐ์ด๋ (https://developers.google.com/sheets/api/quickstart/nodejs)์ ๊ฑฐ์ ์ ํํ ์ฌ๋ณธ์์ Google ์คํ๋ ๋ ์ํธ ๋ ธ๋ ๋ชจ๋์ ์ฌ์ฉํ๋ ๋์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
์ด ์์ ์ฌํญ์ด ์๋ ค์ง ๋ฌธ์ " ํ๋ก์ ํด๋์ค๋ฅผ ํ์ฅํ๋ ํด๋์ค๋ฅผ ์ ์ ํ ์ ์์ต๋๊น?"์ ์ํฅ์ ๋ฏธ์นฉ๋ ๊น? ์๋ ๋ฐ์ฑ์ ๊นฐ ์ ์๋ค๋ ์๋ฏธ๋ ๋ฌด์์ ๋๊น?
์ด ๋ฌธ์ ์ ๋ํ ์ง์ ์ด ์์ต๋๊น?
graceful-fs
๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋๋ฐ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์คํ์ ์ฌ์ฉ ๋ ์คํฌ๋ฆฝํธ์์ ES6 _class_๋ฅผ ๋ด๋ณด๋ผ ๋์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ด๊ฐ ๋ฒ์ญ ํ ํ์ ๊ด์ฐฎ ์์ด
ES5.
๋ถํํ๋ @mjbvz ๊ฐ ๊ฒ์ ํ ์๋ฃจ์ ์ ์๋ ๋ฐ์ค๋ฅผ
์์ด๋์ด๋ ๋งค์ฐ ํ์ํฉ๋๋ค.
์ด ์ํฉ์์ ํด๋ก ์ ์ป์ ์ ์์ต๋๊น?
ํด๋ก ์ ๋์์ด๋์ง ์์ต๋๋ค. ํด๋ก ์ ๊ณ ์ ํ ๊ฐ์น์ด๊ธฐ๋ํฉ๋๋ค.
๋๋ fs.constants
์ ๋ณต์ ๋ณธ์ ์๋ฏธํ๋ฏ๋ก ๋ ์ด์ ์ฝ๊ธฐ ์ ์ฉ์ด ์๋๋๋ค.
๊ทธ๋ฌ๋ฉด ์๋ ๋ฐ์ค๊ฐ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ์ฌ ํธ์คํธ ๋ฒ์ ๋ด์์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์๋ ๋ฐ์ค์ ์ํด ๋ณ๊ฒฝ๋ ๋ชจ๋ ๊ฐ์ฒด๋ ํธ์คํธ์ ์ปจํ ์คํธ์์๋ ์ ํจํ๊ธฐ ๋๋ฌธ์ ์๋ ๋ฐ์ค๋ก ๋ณด๋ผ ๋ด์ฉ์ ๋ํด ๋งค์ฐ์ฃผ์ํด์ผํฉ๋๋ค.
์ฝ๊ธฐ ์ ์ฉ ์ธ ๊ฒฝ์ฐ ํญ๋ชฉ์ ํ์ธํ๋ ๋ฐ ํ๋ก์๊ฐ ํ์ํฉ๋๊น?
์ด ๋ฌธ์ ์ ๋ํ ์
๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
googleapi ๋
ธ๋ ๋ชจ๋์ ์ฌ์ฉํ ๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค ...
https://github.com/patriksimek/vm2/pull/252๋ก ์์ ๋์์ต๋๋ค
@XmiliaH ๊ฐ์ฌํฉ๋๋ค! ์ ๋ง ๊ฐ์ฌํฉ๋๋ค. ์ต์ ๋ฒ์ ์ผ๋ก ์๋ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์คํ์ ์ฌ์ฉ ๋ ์คํฌ๋ฆฝํธ์์ ES6 _class_๋ฅผ ๋ด๋ณด๋ผ ๋์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ด๊ฐ ๋ฒ์ญ ํ ํ์ ๊ด์ฐฎ ์์ด
ES5.