Экземпляр ошибки MarkLogic не определен с помощью модуля преобразования экземпляра

#javascript #entity #marklogic

#javascript #сущность #marklogic

Вопрос:

ошибка: [javascript] JS-JAVASCRIPT: пусть экземпляр = Завершен.extract-instance-CompletedObjectives(источник); — Ошибка при выполнении запроса JavaScript: ошибка ссылки: экземпляр не определен:

Мой код:

 declareUpdate();

const es = require('/MarkLogic/entity-services/entity-services.xqy'); 
const Completed = require('/es-gs/CompletedObjectiveEntity-1.0.0-conv.xqy');
for (const source of fn.collection('Objective,Accomplishments')) {
let instance = Completed.extract-instance-CompletedObjectives(source);
let uri = '/es-gs/env/'  instance.id   '.json';
xdmp.documentInsert(uri, Completed.instanceToEnvelope(instance, "json"),{collections ['CompletedObjective-envelopes']});}
  

Находится в базе данных модулей:
es-gs/CompletedObjectiveEntity-1.0.0-conv.xqy

Ошибка вывода

Трассировка стека в строке 7, столбец 33: в let instance = Completed.extract-instance-CompletedObjectives(source);

  1. const Completed = require(‘/es-gs/CompletedObjectiveEntity-1.0.0-conv.xqy’);
  2. for (const источник fn.collection(‘Цель, достижения’)) {
  3. пусть instance = Completed.extract-instance-CompletedObjectives(источник);
  4. пусть uri = ‘/es-gs/env/’ instance.id ‘.json’;
  5. xdmp.documentInsert(

Имя функции declare function completedObjectives:extract-instance-CompletedObjectives()

Я использовал генератор экземпляров для создания модуля:

 const es = require('/MarkLogic/entity-services/entity-services.xqy');
const ARTIFACT_DIR = '/data/modules/';
const desc = cts.doc('/es-gs/models/CompletedObjective.entity.json');
xdmp.save(ARTIFACT_DIR   'CompletedObjectiveEntity-1.0.0-conv.xqy', es.instanceConverterGenerate(desc));
  

Может кто-нибудь указать мне правильное направление?

Комментарии:

1. Действительно ли ваша коллекция Objective,Accomplishments , или вы намеревались указать массив из двух коллекций: fn.collection(['Objective', 'Accomplishments'])

2. да, я хотел две разные коллекции, но видно, что я получил одну коллекцию

3. fn.collection(‘Objective’, ‘Achievements’)) { — Слишком много аргументов, ожидалось 1, но получено 2

4. Я получаю указанную выше ошибку

5. вы забыли квадратные скобки, он принимает массив в качестве параметра. Не fn.collection('Objective', 'Accomplishments') , но fn.collection(['Objective', 'Accomplishments'])

Ответ №1:

Измените строку 7 вашего кода на:

 let instance = Completed.extractInstanceCompletedObjectives(source);
  

При импорте модуля Entity Services XQuery в модуль JavaScript, даже если методы XQuery имеют кебаб-регистр в исходном коде, они будут открыты и доступны с использованием имен camelCase:

https://docs.marklogic.com/guide/entity-services/getting-started#id_pgfId-1117445

Вызывайте функции, используя их имена в стиле JavaScript с верблюжьим регистром. Например, в случае типа объекта Person функции преобразования модуля могут быть вызваны из серверного JavaScript с использованием следующих имен, предполагая, что модуль представлен переменной с именем person, как показано в приведенном выше требовании require .

  • person.extractInstancePerson
  • person.instanceToEnvelope
  • person.instanceToCanonical

Вы можете проверить имена методов, предоставленные с помощью camelCase, выполнив следующее:

 const Completed = require('/es-gs/CompletedObjectiveEntity-1.0.0-conv.xqy');
let functionNames = [];
for (const property in Completed) {
  functionNames .push(property);
}
functionNames;
  

Комментарии:

1. Я просто хотел добавить, что я использовал es.instanceConverterGenerate для создания модуля преобразования экземпляра, и это имя функции, которое он предоставил

2. Верно, я пропустил, что это был импортируемый модуль служб сущностей XQuery. Несмотря на то, что в модуле XQuery это кебаб, при использовании require() он должен быть виден как extractInstanceCompletedObjectives() . Можете ли вы попробовать это?

3. Да, я получил следующий результат: extractInstanceCompletedObjectives

4. Я изменил строку 7 на предложенный вами код: я получаю следующую ошибку:

5. PlannedObjective.extractInstanceCompletedObjectives не является функцией

Ответ №2:

Я изменил строку 7 в исходном коде выше на:`let instance = Completed ‘ extract-instance-CompletedObjectives’;`