搜索
查看: 359|回复: 4

[入门教程] aardio与node.js交互教程、范例

[复制链接]

143

主题

2132

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11783
发表于 2017-12-20 06:14:56 | 显示全部楼层 |阅读模式
首先请确认你的开发环境是aardio最新版,nodeJs扩展库也升级到了最新版本。
在aardio扩展库管理器中双击nodeJs可以下载范例代码。


一、如何安装 node.js 模块

首先看aardio代码示例:

import nodeJs;
nodeJs.require(
"webpack")
nodeJs.require(
'anu-cli');

nodeJs.cmd(
"anu", "./project_name","--ie")
fsys.setCurDir(
"./project_name");

nodeJs.npm(
"i");
nodeJs.npm(
"start");

console.pause(
true);

调用 nodeJs.require("模块名字") 就可以安装node.js模块,
如果模块已经存在,这句代码会忽略不执行,node.js的模块安装的时候会打开控制台,而且装的过程有时候要很久,耐心等待。

当然,如果个函数只有在开发的时候才需要调用,如果是发布后的程序,模块你应当是事先已经下载好的。

二、启动时把aardio对象作为启动参数传给 node.js

aardio传参数过去的代码非常简单:
import nodeJs;  

//把对象传给 node.js
nodeJs.startEnviron(
    src =
"传个字符串"
    dest = {
        test =
"嵌套的对象表,传给node.js都没问题"
        number = 123;
//数值也可以
        arr ={1;2;3};//数组当然也可以
    }
)

在node.js中接收参数只要调用下面的一句代码就可以获取上面传过来的aardio对象了:
var startEnviron = require('startEnviron')


三、aardio与 node.js在运行时交互

上面只是在启动时传对象过去,但是我们要在运行时进一步的与 node.js交互,相互调用函数,相互传递变量,这就要用到WebSocket来实现RPC调用了,当然,这个代码非常简单(源码演示看后面的回复帖子)。

建议大家单独看一下 aardio范例中的例子,再去看与 node.js 交互的代码就非常简单了。
范例位置:aardio范例 -> Web应用 -> WebSocket -> JSON-RPC 服务端/客户端


回复

使用道具 举报

143

主题

2132

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11783
 楼主| 发表于 2017-12-20 06:21:48 | 显示全部楼层

示例一:aardio做界面调用node.js解压asar文件

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio做界面调用node.js解压asar文件";right=714;bottom=229)
winform.add(
btnExtractAll={cls=
"button";text="解压";left=451;top=115;right=618;bottom=179;z=3};
btnOpen={cls=
"button";text="选择要解压的文件";left=499;top=42;right=657;bottom=85;z=2};
editAsarFile={cls=
"edit";left=55;top=45;right=494;bottom=83;edge=1;multiline=1;z=1}
)
/*}}*/

import fsys.dlg;
winform.btnOpen.oncommand =
function(id,event){
    winform.editAsarFile.text = fsys.dlg.open(
"*.asar|*.asar|","选择asar文件",,winform.hwnd)
}


winform.btnExtractAll.oncommand =
function(id,event){
    winform.btnExtractAll.disabled =
true;
   
    win.invoke(
        
function(winform){
            
import nodeJs;  
            
            nodeJs.startEnviron(
                src = winform.editAsarFile.text;
                dest = fsys.getParentDir(winform.editAsarFile.text) ++ fsys.getFileName(winform.editAsarFile.text) +
"_ExtractAll";
            )
            
            nodeJs.require(
'asar');
            
            
var testjs = /***
            var startEnviron = require('startEnviron')
            var asar = require('asar');
            
            asar.extractAll(startEnviron.src, startEnviron.dest )
            ***/

            
var node = nodeJs.exec(testjs);
        },winform
    )
   
    winform.btnExtractAll.disabled =
false;
}

winform.show(
true);
win.loopMessage();

回复

使用道具 举报

143

主题

2132

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11783
 楼主| 发表于 2017-12-20 06:23:16 | 显示全部楼层

示例二:基于HTTP/JSON-RPC协议aardio与node.js交互

import nodeJs;

//自动安装node.js模块
nodeJs.require('jayson');

//可以指定node.js中可以使用的启动参数,这里省略,默认会添加port属性
nodeJs.startEnviron({})

var testjs = /***
var startEnviron = require('startEnviron')
var jayson = require('jayson')

//创建服务端
var server = jayson.server({
  brest: function (args, callback) {
    callback(null, startEnviron)
    listener.close() ;
  }
})

//启动服务端
var listener = server.http().listen(startEnviron.port);
***/


//运行JS代码创建服务端
var node = nodeJs.exec(testjs);

import console;
import web.rpc.jsonClient;
var jsonRpc = web.rpc.jsonClient("http://localhost:" + nodeJs.port );

//使用aardio调用node.js函数
var jsonData = jsonRpc.brest("admin","123123");

//显示node.js返回值
if( jsonData.result ){
   console.dump( jsonData.result );
}
else {
    console.dump( jsonData.error.message );
}

console.pause(
true);

  

回复

使用道具 举报

143

主题

2132

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11783
 楼主| 发表于 2017-12-20 06:25:00 | 显示全部楼层

示例三:基于WebSocket协议aardio与node.js交互


import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio创建WebSocket/JSON-RPC 服务端与Node.js交互的例子";left=10;top=4;right=774;bottom=467)
winform.add(
txtMessage={cls=
"edit";left=29;top=22;right=741;bottom=432;db=1;dl=1;dr=1;dt=1;edge=1;multiline=1;z=1}
)
/*}}*/

//创建WebSocket服务端
import web.socket.server;
var wsrv = web.socket.server();

//创建JSON-RPC服务端
import web.socket.jsonServer;
var rpcServer = web.socket.jsonServer(wsrv);

//指定 node.js 客户端可以调用的对象和方法
rpcServer.external ={
   
    hello =
function(a,b){
        winform.txtMessage.print(
"node.js调用hello函数,参数:",a,b);
        
return "来自aardio的返回值 " ;
    }

    aardio  = {
   
        print =
function(txt){
            winform.txtMessage.print( txt );
        }
    }
}

//客户端使用HTTP请求切换到WebSocket协议
wsrv.onUpgradeToWebsocket = function(hSocket,request,response,protocol,origin){   
   
return rpcServer.start(hSocket);
}

//启动服务端
wsrv.start();

var ip,rpcPort = wsrv.httpServer.getLocalIp()

import nodeJs;
nodeJs.startEnviron(
    wsUrl = wsrv.getUrl();
//设置node.js的启动参数
)

winform.txtMessage.print(wsrv.getUrl())

/*
找个WebSocket RPC模块装上,首次安装模块耐心等待可能有点慢,
如果已经安装了模块,这句代码会自动忽略不执行
*/

nodeJs.require(
"json-rpc-ws")

var testjs = /***
var startEnviron = require('startEnviron');
var wsRpc = require('json-rpc-ws');
  
var client = wsRpc.createClient();

client.connect(startEnviron.wsUrl, function connected () {

    client.send('hello', ['JS传过来的参数1', 'JS传过来的参数2'], function mirrorReply (error, reply) {

        //也可以支持名字空间,注意调用参数必须放到数组里
        client.send('aardio.print', [reply]);
    });
});
***/


/*
不用担心node.js进程,
aardio运行他就运行,aardio退出他也会退出
*/

var node = nodeJs.exec(testjs);


winform.show()
win.loopMessage();

回复

使用道具 举报

3

主题

54

帖子

927

积分

三级会员

Rank: 4

积分
927
发表于 2017-12-20 11:42:29 | 显示全部楼层
太牛逼了。这样把nodejs和aardio两者的优势都结合了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-1-19 17:37 , Processed in 0.046875 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表