plv8 JavaScript语言扩展可以调用第三方库吗?

时间:2017-07-16 16:48:40

标签: postgresql plv8

在Postgresql中,我想调用第三方库,如moment.js或AWS lambda JS Client,以从DB中调用无服务器功能。我没有看到任何文档或示例如何执行此操作:  https://github.com/plv8/plv8/blob/master/README.md

这是可能的,我在哪里可以找到如何“导入”或“需要”其他库的示例?

2 个答案:

答案 0 :(得分:6)

plv8语言是受信任的,因此无法从文件系统加载任何内容。但是,您可以从数据库加载模块。

创建一个包含模块源代码的表,并使用selecteval()加载它。一个简单的例子来说明这个想法:

create table js_modules (
    name text primary key,
    source text
);

insert into js_modules values
('test', 'function test() { return "this is a test"; }' );

js_modules加载模块中的模块:

create or replace function my_function()
returns text language plv8 as $$
//  load module 'test' from the table js_modules
    var res = plv8.execute("select source from js_modules where name = 'test'");
    eval(res[0].source);
//  now the function test() is defined
    return test();
$$;

select my_function();

CREATE FUNCTION
  my_function   
----------------
 this is a test
(1 row) 

您可以在这篇文章中找到一个更精细的例子,其中包含一个优雅的require()函数:A Deep Dive into PL/v8.。它基于plv8.start_proc(另请参阅short example here)。

答案 1 :(得分:0)

我有两个提示指向 NO 方向:

  1. You can use PLV8 in Amazon RDS PosgreSQL。 RDS不允许任何不受信任的语言。正如PostgreSQL文档中所解释的那样:

      

    <强>可信

         

    TRUSTED指定该语言不授予用户不具备的数据的访问权限。

    如果PLV8可以使用库,那些(很可能)允许执行诸如通过HTTP下载数据或检查文件系统等操作,这会违反此限制(并且可能使RDS系统处于黑客攻击风险)。 / p>

  2. 演讲PLV8 - The PostgreSQL web side由Lucio Grenzi撰写。

    幻灯片#10:

      

    PLV8:受信任的语言

         

    [...]

         
        
    • 无法从文件系统加载外部处理模块
    •   
  3. 可能的替代方案

    我使用了PLPERLuu含义不受信任的)语言。使用该语言,您可以使用use个库。您的库应该位于PostgreSQL使用的PERL安装的标准位置(如CREATE LANGUAGE所定义)。