Jak obsługiwać REST API w node.js w Marklogic Grove?

Nov 09 2020

Rozwijam aplikację UI przy użyciu MarkLogic Grove (React).

Domyślnie wywołania REST API z przeglądarki internetowej będą przekazywane bezpośrednio do MarkLogic.

Na przykład: http: // nazwa hosta / v1 / resources / foo /

Jeśli REST API jest określoną ścieżką, chciałbym wykonać przetwarzanie w node.js tak, jak jest, bez przekazywania wywołania do MarkLogic. Gdzie i jak mam to zaimplementować? (Dostępne tylko dla uwierzytelnionych użytkowników).

Na przykład: http: // nazwa_hosta / my-rest-api / bar

Chciałbym uzyskać poradę, ponieważ jest zbyt dużo kodu źródłowego dla Grove i jest to mylące.

Odpowiedzi

1 grtjn Nov 09 2020 at 09:38

Niestety, dokumentacja Grove jeszcze nie istnieje. Jeśli mówisz o kierowaniu wywołań frontendu do zaplecza MarkLogic, mówisz o środkowym poziomie Grove: węzeł-Grove . W tym podprojekcie zawarto pewną dokumentację, która jest prawdopodobnie najlepszym miejscem do rozpoczęcia.

Plik README najwyższego poziomu tego podprojektu zawiera wskaźnik do dalszej dokumentacji dotyczącej punktów końcowych i tras . Nie zapewnia też dużej pomocy, ale wskazuje, gdzie szukać. Warstwa środkowa węzła grove-node to w zasadzie serwer ExpressJS . Ukryliśmy główną, głównie statyczną logikę w module podrzędnym, który można znaleźć tutaj . Ważną częścią jest faktyczna logika biznesowa (tzw. Middleware) została umieszczona w folderze o nazwie routes/.

Tam możesz napisać / dodać dowolną logikę ExpressJS, chociaż staraliśmy się zapewnić szereg powszechnie używanych funkcji w postaci domyślnych tras. Możesz znaleźć routeFactoryu góry routes/api/index.js.

Gałąź główna, zawierająca ostatnią wersję grove-node, jest dość aktualna, ale nadal może być przydatne sklonowanie gałęzi rozwojowej tego repozytorium i zastąpienie / zaktualizowanie zawartości wygenerowanego middle-tier/folderu w projekcie zawartością z tej gałęzi rozwoju. Powinieneś być w stanie przeprowadzić dość proste porównanie katalogów, aby zastosować aktualizacje, które wyglądają na wartościowe.

Gałąź rozwojowa zawiera co najmniej nowy dodatek o nazwie Grove defaultRestRoute, który umożliwia przepisywanie losowych identyfikatorów URI na dowolny nowy docelowy URI w MarkLogic. Pierwotnie przeznaczone do rozszerzeń REST, ale bardzo przydatne do mapowania na przykład do usług danych, / v1 / values, / v1 / rows lub / v1 / sparql. Jest to znacznie lepsze podejście niż starszy serwer proxy z białą listą, który utrzymywaliśmy głównie w celu szybkiego obejścia i kompatybilności wstecznej.

Tutaj przykład użycia defaultRestRoute, ten kod został dołączony pod koniec middle-tier/routes/api/index.js:

// Special case for Raw Media
router.use('/crud/Media/:mediaId/:binaryType', function(req, res, next) {
  let mediaId = decodeURIComponent(req.params.mediaId);
  let binaryType = decodeURIComponent(req.params.binaryType);
  return routeFactory.defaultRestRoute({
    authProvider: authProvider,
    authed: true, // default: true
    neverCache: true, // default: true
    action: {
      uri: '/v1/documents',
      GET: function() {
        return {
          method: 'GET',
          body: null,
          params: {
            uri: '/Media/' + mediaId + '/binary.' + binaryType
          }
        };
      }
    }
  })(req, res, next);
});

Jest używany w aplikacji, która ma punkt końcowy CRUD dla jednostki o nazwie Media. Powyższa trasa zapewnia dostęp do rzeczywistego pliku binarnego pliku multimedialnego, podczas gdy zwykłe wywołanie CRUD GET zwraca kopertę Entity zawierającą metainformacje.