使用JavaScript脚本

javascript脚本定位

SQLRestful定位就是采用SQLJavaScript完成微服务开发,其中JavaScript脚本用于完成下述工作:

  • 与其他微服务接口进行交互;
  • 实现请求身份验证功能;
  • 校验请求参数是否合法;
  • 请求参数到SQL绑定参数转换;
  • SQL返回结果的转换能力;
  • 实现微服务逻辑处理功能;

它支持完整的ECMAScript 5.1规范(由 goja 提供实现支持)。

javascript脚本默认变量

SQLRestful中,参数转换(bind宏),身份验证实现(authorizer宏)的JS脚本可以通过$input变量 获取到请求输入参数列表,同时可以通过$input.http_xxxx来获取请求头内容,假设客户端请求发送一个名称为X-Test-MM 的请求,则通过以下表达式拿到请求头内容:

$input.http_x_test_mm

所有请求头都会转换成小写加上http_前缀,同时为了遵循JS对象属性命名规则会把“-”替换为“_”。

应答转换(transformer宏)的脚本通过变量$result可以获取到exec宏返回的原始数据,具体见如下示例代码:

test {

  ...

  transformer = <<JS
    (function(){
    $new_result = $result
    $new_result.trans_test = "13456"
    return $new_result  
    })()
  JS

  ...

}

除此之外,每个JS脚本都可以获取以下参数:

参数名 参数说明
$input.http_method 当前请求方法:GET、POST、PUT、PATCH、DELETE
$input.http_scheme 当前请求协议头:http、https
$input.http_path 当前请求上下文路径
$input.http_url 当前请求URL地址
$input.http_uri 当前请求URI地址
$input.http_remote_addr 当前请求远程IP地址(或前置代理地址)
$input.http_real_ip 当前请求真实IP地址:
请求头X-Forwarded-ForX-Real-IP的值
$input.data 消息对象,接口定义为监听消息队列或者websocket接口时
$input.__clientid__ 客户端ID,接口为websocket
$name 当前微服务实现宏名称
$stage JS所在过程名称:validators、authorizer、const、
transformer、bind、provider、exec、total

javascript脚本内置函数

SQLRestfulJS脚本内置了两个默认的HTTP请求函数和一个控制台日志输出函数:

  • fetch
  • call_api
  • log
  • exec_sql
  • exec_cmd
  • emit_msg
  • ws_broacast
  • ws_send
  • call_macro

fetch函数

函数原型

function fetch(URL, {
  method: "HTTP METHOD", //请求方法,如GET、POST、PUT
  headers: { //请求头
    ...
  },
  body: ... //请求体,可以是JSON或字符串。
})

返回结果

{
  "status":     "应答状态文本",
  "statusCode": "HTTP应答码",
  "headers":    "HTTP应答头",
  "body":       "应答内容字符串",
}

call_api函数

此函数提供后台调用在应用网关中注册的微服务后台接口

它通过SQLRestful服务配置的 JWT RSA 私钥与 JWT 安全令牌产生 JWT 请求令牌并发起接口请求。

具体JWT令牌请求方式参见《通过网关调用后台服务接口 》中的说明。

函数原型

function call_api(URL, {
  method: "HTTP METHOD", //请求方法,如GET、POST、PUT
  headers: { //请求头
    ...
  },
  body: ... //请求体,可以是JSON或参数内容。
})

返回结果

正常情况下 call_api 函数直接返回接口的JSON对象,只有在请求出错的情况下返回如下定义:

{
  "status":     "应答状态文本",
  "statusCode": "HTTP应答码",
  "headers":    "HTTP应答头",
  "body":       "应答内容字符串",
}

如果请求的接口应答内容不能转换为JSON对象则返回与fetch函数相同的应答:

log函数

函数原型

function log(message, ...)

使用示例

(function(){
  log("debug:", "hello world!")
})()

exec_sql函数

执行SQL查询语句并返回查询结果。

函数原型

function exec_sql(cmdline, args{})

使用示例

(function(){
  var ret = exec_sql("select * from where id = :id", {
    id: 10000
  })
  return ret === undefined ? undefined : ret[0]
})()

exec_cmd函数

用于执行命令并返回结果。

函数原型

function exec_cmd(command, args...)

使用示例

(function(){
  var dirout = exec_cmd("ls", "-l", "/")
})()

emit_msg函数

用于发送消息并返回结果。

函数原型

emit_msg(dest, msg, headers{...})

使用示例

(function(){
  var dirout = emit_msg("app.foo.bar", "test message queue")
})()

ws_broacast函数

用于广播websocket消息。

函数原型

ws_broacast(endpoint, msg{...})

使用示例

(function(){
  ws_broacast("test", "test msg")
})()

ws_send函数

用于发送websocket消息到指定的客户端。

函数原型

ws_send(endpoint, clientid, msg{...})

使用示例

(function(){
  ws_send("test", $input.__clientid__, "test msg")
})()

call_macro函数

用于请求其他的定义实现。

函数原型

exec_macro(macro, input{...})

使用示例

(function(){
  exec_macro("input", {test:"test msg"})
})()

results matching ""

    No results matching ""

    results matching ""

      No results matching ""