【问题标题】:Binding custom node addon to lua with extentions使用扩展将自定义节点插件绑定到 lua
【发布时间】:2016-08-06 12:59:53
【问题描述】:

我在 nodejs 代码中有大量异步函数,我想将它们公开给 lua。基本思想是我想执行 lua 脚本并允许这些脚本回调我的一些 nodejs 代码,以及从执行的 lua 脚本中异步返回一个值,

在这个例子中,myCustomNodejsAddon 是我编写的一个自定义插件,它知道如何绑定 lua 和运行 lua 脚本。一个悬而未决的问题是如何从 lua 脚本异步返回值?

以前有人做过这样的事情吗?我会对任何指针、想法、示例非常感兴趣。

用更好的例子编辑:

-- user written lua script
getUser(1, function(err, user)
   if err then
      print('Error', err)
   else
      print('Found user with id', user.id)
      return ''
   end
end)
/*Create object with mapping of async functions*/
var callbacks = {
   "getUser": function(userId, cb) {
      db.Users.fetchById(userId).then(function(user) {
         cb(null, user);
      }, function(err) {
         cb(err, null);
      }
   }
};
myCustomNodejsAddon.provideCallbacks(callbacks);

/* user written lua script has been stored into `scriptSrc` variable */
myCustomNodejsAddon.execute(scriptSrc, function(returnValueOfScript) {
   console.log('done running user script: ', retrunValueOfScript);
});

【问题讨论】:

    标签: node.js lua


    【解决方案1】:

    我想到了不止一种解决这个问题的方法。

    首先是创建一个 nodejs 脚本,该脚本一旦执行就读取程序命令行参数或输入流,并执行此通道指示的代码,并将响应以 JSON 格式流回。这是这样做的侵入性较小的方式。脚本类似于:

    if(require.main === module){
       // asume first argument to be the source module for the function of iterest
       var mod = require(process.argv[2]);
       var fnc = mod[process.argv[3]];
    
       args = process.argv.slice(4);
    
       // by convention the last argument is a callback function
       args.push(function(){
           console.log(JSON.stringify(arguments));
           process.exit();
       })
    
       fnc.apply(null, args);
    }
    

    一个示例用法是:

    $ node my-script.js fs readdir /some/path
    

    这将根据/some/path 上的文件返回类似 [null, ['file1', 'file2']] 的内容。然后你可以用这个脚本创建一个调用节点的lua模块,并根据你要调用的函数传递参数。

    【讨论】:

    • 这将如何处理问题的async 部分?这个过程的 lua 方面是什么样的?
    • 这将处理问题的异步部分,因为 Nodejs 进程只会在调用回调后写入输出流。从而异步产生结果。有一段时间我不使用 Lua,所以我不确定如何实现那部分
    • 也许你可以使用这里给出的答案stackoverflow.com/questions/2829404/…
    • @yeiniel 虽然你的建议很明确,但我需要 nodejs 提供的异步和闭包。我给出的示例可能过于简单,但需要保留其结构以满足我更复杂的要求。
    • 我理解您的观点@EToreo,但没有更多详细信息,我为您提供了可能处理您在 lua 代码中公开的情况的代码,并且它处理它支持 Nodejs 的异步性质。也许您可以提供一个具体的例子以便提供更好的答案。
    猜你喜欢
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    相关资源
    最近更新 更多