如何在动态包含的脚本中 引用主文件中的上正文
发布于 10 年前 作者 yakczh 3726 次浏览 最后一次编辑是 8 年前 来自 问答

比如 主文件是app.js

var http = require('http');
var url = require("url");
http.createServer(function (req, res) {
	var parsedUrl = url.parse(req.url, true); // true to get query as object
    var queryAsObject = parsedUrl.query;


	if (queryAsObject['file']){
      var file= './'+queryAsObject['file']+".js";
      require(file);
	}

  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

test.js 是动态引入的文件

console.log('this is test');
console.log( parsedUrl);

通过http://127.0.0.1:1337/?file=test 这样动态引入

如何才能在test.js中访问到 主文件app.js中的变量呢? 或者传一个Conntext变量 把需要的变量打包到里面整体传递给test.js

6 回复

可以把 test.js 写成一个函数,这样 require 进来的是一个函数。主文件的变量可以这个函数的参数传进去。

@leapon

var file= './'+queryAsObject['file']+".js";
      require(file);

这一行怎么把函数参数传进去?

@yakczh

假设myfile.js 里是一个函数 myfunction(setting)

var setting = { name:'app' }; 
var myfunction = require('myfile.js');
myfunction(setting);

简化点,还可以:

var mystuff = require('myfile.js')(setting);

你需要使用nodejs的vm模块 https://nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_options

var localVar = 'initial value';

var vmResult = vm.runInThisContext('localVar = "vm";');
console.log('vmResult: ', vmResult);
console.log('localVar: ', localVar);

var evalResult = eval('localVar = "eval";');
console.log('evalResult: ', evalResult);
console.log('localVar: ', localVar);

// vmResult: 'vm', localVar: 'initial value'
// evalResult: 'eval', localVar: 'eval'

如果要用于生产环境 最好考虑下安全性之类的 一般不会真的在当前上下文运行外部代码

req.parserurl = parserurl REQ和RES的维持与特性最适合做此类传递

回到顶部