Aerospike Nodejs регистрирует UDF в файле .lua - PullRequest
0 голосов
/ 24 января 2019

вот моя проблема.

Я зарегистрировал такой модуль

asclient.client.udfRegister('./lua/lm.lua', function (error) {
  if (error) {
    console.error('Error: %s [%d]', error.message, error.code)
  }
});

После этого кода я проверяю, правильно ли зарегистрирован мой модуль

aql> show modules

и вывод

| "lm.lua" | "824bf77bff0f8b35c4eacc5ddcee82b1802a0c63" | "LUA" |

, поэтому я почти уверен, что модуль загружен

Затем я пытаюсь применить некоторые функции в этом файле lm.lua

var ctoken = '0878d655bd4c438236b060b9b1c1d2af';
var key = new Key('namespace', 'set', 12345)
var udf = { module: 'lm', funcname: 'getlm', args: [ctoken]}
asquery.client.apply(key, udf, function (error, result) {
  if (error) throw error
    console.log(result);
});

Содержимое файла lua

   function getlm(stream, conv)

    local function transformer(rec)
        local touple = map()
        touple["1"] = rec["1"]
        touple["2"] = rec["2"]
        touple["3"] = rec["3"]
        return touple
    end

    return stream:map(transformer)
end

По сути, я сопоставляю все поля в AS и просто хочу вернуть какой-то результат, чтобы убедиться, что он работает правильно, но по какой-то причине всегда возвращаю

AerospikeError: /opt/aerospike/usr/udf/lua/lm.lua:17: attempt to call method 'map' (a nil value)

Есть ли способ выгрузить данные внутри этого файла .lua или просто проверить, совпадают ли данные потока с ожидаемыми

Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Если вы хотите использовать метод client.apply() для применения UDF к отдельной записи, то вам нужно переписать вашу функцию getlm как Запись UDF . (Как указано @pgupta.)

Пример:

demo.lua:

function getlm(rec)
  local tuple = map()
  tuple["1"] = rec["1"]
  tuple["2"] = rec["2"]
  tuple["3"] = rec["3"]
  return tuple
end

apply.js:

const Aerospike = require('aerospike')

Aerospike
  .connect()
  .then(async client => {
    await client.udfRegister('demo.lua').then(job => job.wait())
    const key = new Aerospike.Key('test', 'test', 'test')
    await client.put(key, { '1': 'foo', '2': 'bar', '3': 'fox' })
    const udf = { module: 'demo', funcname: 'getlm'}
    const result = await client.apply(key, udf)
    console.info(result)
    client.close()
  })
  .catch(error => {
    console.error(error)
    if (error.client) error.client.close()
  })
$ node apply.js
{ '1': 'foo', '2': 'bar', '3': 'fox' }
0 голосов
/ 24 января 2019

Я бы посоветовал проверить ваш звонок на подачу заявки (). Я думаю, что это должен быть client.query.apply (). Я не вижу ничего явно не так с UDF. client.apply () Я думаю, что для recordUDFs, которые работают с отдельными записями и могут изменить их. У них нет метода map (). Для потоковых пользовательских функций, которые вы пишете, query.apply () будет поддерживать map ().

...