Node.js 是否可以将函数从服务器发送到客户端?

Node.js 是否可以将函数从服务器发送到客户端?,node.js,Node.js,由于我对NodeJS/Javascript的工作原理了解甚少,我相信这应该是可能的。是吗 我希望能够基于http请求向客户机发送函数,类似这样(伪短代码): 我曾尝试将函数从服务器转换为字符串,并将其转换回客户端上的对象,但它返回了错误,我无法理解为什么我会发送一个简单的键值json对象 // server const http = require('http'); const port = 3000; const hostname = '127.0.0.1'; const server =

由于我对NodeJS/Javascript的工作原理了解甚少,我相信这应该是可能的。是吗

我希望能够基于http请求向客户机发送函数,类似这样(伪短代码):

我曾尝试将函数从服务器转换为字符串,并将其转换回客户端上的对象,但它返回了错误,我无法理解为什么我会发送一个简单的键值json对象

// server
const http = require('http');
const port = 3000;
const hostname = '127.0.0.1';

const server = http.createServer((req, res) => {
    if (req.url === '/function') {
        res.statusCode = 200;
        function func () {
            console.log('test')
        }
        res.end(func.toString())
    }
});

server.listen(3000)

我们的想法是让客户端能够执行几乎所有的代码,而无需更新客户端本身。

我不确定这是不是最好的主意。

历史上,您描述的客户机-服务器关系与客户机调用远程服务器上特定端点的位置相反。听起来让客户机任意执行代码的最大好处是删除了对客户机代码的更新。如果要对服务器代码进行向后不兼容的更改,会发生什么情况?我认为使用版本化的API端点来执行基于客户端逻辑的服务器端代码会取得更好的成功,在npm中可以找到许多RPC和/或REST框架

ideia需要一个客户端,它能够执行几乎所有的代码,而无需更新客户端本身


最后要记住的一件事是它的安全影响。如果我在恶意JavaScript中找到您的客户端并替换它,会发生什么情况?

我不知道您为什么要这样做,这确实不安全,您不应该让web应用程序这样做。但这里有:

假设您有一个函数:

function test() {
  console.log("test")
}
和作为字符串:

const funcString = test.toString()
// ^ is now "function test() {\n  console.log(\"test\")\n }"
首先需要获取函数体:

const funcBody = funcString.replace(/^[^{]+{/, '').replace(/}[^}]*$/, '')
// ^ is now "console.log(\"test\")"
然后从中创建一个函数:

const newTest = Function(funcBody)
现在,如果调用
newTest()
,您将看到控制台中打印的
test


请注意,我用来获取函数体的正则表达式不能用于所有函数。例如,对于
const test=()=>1
您将需要一个不同的正则表达式。

非常感谢。这与预期一样有效,包括声明函数
function test(){}
const test=()=>{}
的两种方式。我知道这很危险。目前,它只是为了学习和理解各种可能性,但其想法将是在隔离环境、身份验证和网络ACL等中使用它。它将在nodejs服务中运行,而不是在web中运行,类似于远程机器上的任务运行程序。还有
eval()
,但我不能说得太多,如果你不是100%确定自己在做什么,请不要使用它。@Tuts是的,我一写它就意识到我不是100%确定自己在做什么,因为我是NodeJS/Javascript的初学者,然而,我喜欢做“实验”,我认为这将是一种有趣的方式,呵呵。。。再次感谢你的建议。嗨。我理解安全问题,完全同意你的看法。正如我对@aravindan ve的回答,它是为了学习和理解各种可能性,但其思想将是在具有身份验证和网络ACL等的隔离环境中使用它。
const funcBody = funcString.replace(/^[^{]+{/, '').replace(/}[^}]*$/, '')
// ^ is now "console.log(\"test\")"
const newTest = Function(funcBody)