Aerospike NodeJS UDF 聚合错误

我创建了一个在Aerospike以及AQL中都可以使用的聚合函数:

AGGREGATE filter2.check_teamId('123', 0, 1456499994597) ON analytics.tracking
WHERE teamId = '123'

这可以返回结果。 然后我尝试在NodeJS中使用相同的UDF:

var statement = {
    aggregationUDF: {module: 'filter2', funcname: 'check_teamId',
    arg:['123', 0, 1456499994597]}
};

var query = client.query('analytics', 'tracking', statement);
var stream = query.execute();

结果是一个似乎不含任何信息的错误:

{ code: 100,
  message: 'UDF: Execution Error 1',
  func: 'as_query_aggregate',
  file: 'src/main/aerospike/aerospike_query.c',
  line: 903 }

服务器日志则表示:

Feb 28 2016 22:33:58 GMT: INFO (scan): (scan.c::933) starting aggregation scan job 1201452721893048027 {analytics:tracking} priority 2

Feb 28 2016 22:33:58 GMT: INFO (scan): (scan.c::1026) finished aggregation scan job 1201452721893048027 (0)

有人有关于如何使UDF与NodeJS正常工作的提示吗? 或者有任何诊断错误的想法吗?

我已经在配置中设置了用户UDF的位置,但这并没有影响结果。

更新: 这里是lua代码:

local function map_profile(record)
  return map {interaction=record.interaction,
              teamId=record.teamId, datetime=record.datetime,
              timestamp=record.timestamp, version=record.version,
              interactions=record.interactions}
end
function check_teamId(stream, teamId, startDate, endDate)
  local function filter_teamId(record)
    return record.teamId == teamId and
           record.timestamp >= startDate and record.timestamp <= endDate
  end
  return stream : filter(filter_teamId) : map(map_profile)
end
点赞
用户1573115
用户1573115

最有可能出现UDF执行错误(代码:100)的原因是LUA子系统的系统和/或用户路径没有正确设置。如果您为客户端打开调试日志,您可能会看到以下一个或两个错误消息:

Apr 04 2016 08:15:19 UTC: DEBUG(45951) [conversions.cc:248] [config_from_jsobject] - Could not find a valid LUA system path ./aerospike-client-c/package/usr/local/aerospike/client/sys/udf/lua/
Apr 04 2016 08:15:19 UTC: DEBUG(45951) [conversions.cc:273] [config_from_jsobject] - Could not find valid LUA user path ./aerospike-client-c/package/usr/local/aerospike/client/usr/udf/lua

如果客户端无法自动确定正确的路径,则必须在配置中传递系统/用户路径。 (见下文。)

但是,在Node.js客户端中调用UDF的另一个问题是,UDF的参数应在“aggregationUDF”对象的“args”元素中传递,而不是在“arg”中。

以下是一个对我有效的完整示例:

const Aerospike = require('aerospike')

const config = {
  hosts:'192.168.33.10:3000',
  日志:{级别:5},
  modlua:{
    userPath:'./',
    systemPath:'./node_modules/aerospike/aerospike-client-c/lua/'
  }
}

Aerospike.connect(config,(error,client)=> {
  iferror)throw error

  var语句= {
    aggregationUDF:{
      module'agg',funcname:'check_teamId',args:['123'01456499994597]
    }
  }
  var查询=client.query('test''tracking',statement)
  var stream = query.execute()

  var count = 0
  stream.on('error', (error) => console.error('error:', error))
  stream.on('data', (result) => {
    count ++
    console.log('result:', result)
  })
  stream.on('end',() => {
    console.log('found %d records', count)
    client.close()
  })
})

请注意,此示例使用刚发布的aerospike@2.0.0-alpha.1客户端版本。但是,使用UDF查询的设置和执行与v1.x客户端相同。

我还将此示例上传到了Github [here](https://gist.github.com/jhecking/3aeb47ed6adba291f9039ce7c92b04cc“使用Aerospike Node.js客户端的Lua聚合函数的Aerospike聚合查询示例”)。此Gist还包括一个setup.js脚本,以基于您的“map_profile”函数期望的内容创建一些示例记录。

请随时在我们的[user forum](https://discuss.aerospike.com/c/client-libraries/node-js-client“气电用户论坛-客户端库-Node.js客户端”)跟进此问题。我很想听听您是否已将此应用于您的应用程序。(或关于Aerospike Node.js客户端的任何其他反馈!)

2016-04-04 08:56:50