从NodeJS调用Rust

时间:2015-08-20 13:46:36

标签: node.js rust node-ffi

我试图建立一个简单的生锈的收割机'为我的soup.io博客,然后使用node.js将这些条目发布到diaspora(因为有一个npm包)

我想学习如何使用节点生锈,这就是我建立这个项目的原因。

我的问题是,我不知道如何使用正确的类型调用com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'limit, match_mid, pick) values (1, 2.5, 9358, 'under')' at line 1 函数。

ffi

var lib = ffi.Library('target/debug/libmain', { 'get_soup': ['Vec<Post>', ['String']] }); 不起作用。 我知道我必须使用'Vec<Post>'。 但我真的不知道实际上是怎么做的。

我知道我必须将锈类型转换为javascript吗?

如何在我的ffi函数中使用ref

我的github项目:Realtin/suppe

以及相关代码:

Rust代码:

Vec<Post>

NodeJS代码:

extern crate rss;
extern crate hyper;

use rss::Rss;
use std::io::prelude::*;

#[derive(Debug)]
pub struct Post  {
    title: String,
    link: String,
    description: String,
}

fn main() {
    let user = "realtin".to_string();
    let vec = get_soup(&user);
    println!("{:?}", vec[vec.len()-1]);
}

#[no_mangle]
pub extern fn get_soup(user: &str) ->Vec<Post>{
    let url = format!("http://{}.soup.io/rss", user);
    let mut vec = Vec::new();

    let client = hyper::Client::new();
    let mut response = client.get(&url).send().unwrap();

    let mut suppe = String::new();
    let _= response.read_to_string(&mut suppe);

    let rss::Rss(channel) = suppe.parse::<rss::Rss>().unwrap();

    for item in channel.items.into_iter().rev() {
      let item_object = Post {
           title: item.title.unwrap(),
           link: item.link.unwrap(),
           description: item.description.unwrap(),
        };
        vec.push(item_object);
    }
    return vec;
}

2 个答案:

答案 0 :(得分:6)

简短的回答:你不能为FFI绑定导出任何Rust函数,你需要专门导出与C兼容的Rust函数。

具体来说,这意味着您只需要公开C-struct兼容对象或公开不透明指针(只能通过Rust函数进行操作)。

在您的情况下,git diff与FFI中的使用不兼容,因为Vec<Post>不是。

您可以在FFI Guide

中找到更多信息

答案 1 :(得分:-1)

某些数据类型可以使用您的方法直接传递

使用FFI导出Rust https://svartalf.info/posts/2019-03-01-exposing-ffi-from-the-rust-library/

,然后使用类似https://github.com/node-ffi/node-ffi

的方式从nodejs调用它

可能未使用您需要的结构,但是您可以在一端或两端转换数据。 作为最后的选择,您可以使用JSON。会有一些开销,但不是很多

https://stackoverflow.com/a/42498913/3232611

如果JSON性能是瓶颈,则可以使用协议缓冲区,但在大多数情况下不值得复杂化