{"id":107,"date":"2015-08-25T17:57:31","date_gmt":"2015-08-25T16:57:31","guid":{"rendered":"http:\/\/www.fluxnumerique.fr\/?p=107"},"modified":"2020-12-13T10:12:43","modified_gmt":"2020-12-13T09:12:43","slug":"utiliser-node-js-avec-marklogic-8","status":"publish","type":"post","link":"https:\/\/www.fluxnumerique.fr\/?p=107","title":{"rendered":"Utiliser Node.js avec Marklogic 8"},"content":{"rendered":"<p>Le SGBD NoSQL Marklogic 8 dispose d&rsquo;une API Node.js, qui permet de d\u00e9velopper rapidement de petites (ou puissantes ?) applications Web.<\/p>\n<p>Partons du principe que vous avez install\u00e9 Node.js (version 0.12.7) le jour o\u00f9 j&rsquo;\u00e9cris ces lignes, et que vous commencez \u00e0 savoir vous en servir.\u00a0Vous trouverez sur le <a href=\"http:\/\/www.marklogic.com\/what-is-marklogic\/whats-new\/nodejs-client-api\/\">What&rsquo;s new<\/a> de Marklogic 8 une introduction sur l&rsquo;int\u00e9gration de Node.js dans ce produit.<\/p>\n<h1>Installation du client<\/h1>\n<p>Sur npm, vous trouverez un client marklogic officiel, que vous installerez via la commande<\/p>\n<pre class=\"theme:dark-terminal lang:default decode:true \" title=\"installation du client node.js marklogic\">$ npm install marklogic<\/pre>\n<p>Vous obtiendrez\u00a0un warning lors de l&rsquo;installation :<\/p>\n<pre class=\"theme:twilight lang:default decode:true \">npm WARN engine marklogic@1.0.1: wanted: {\"node\":\"&gt;=0.10.26 &lt;0.11\"}\r\n(current: {\"node\":\"0.12.0\",\"npm\":\"2.5.1\"})<\/pre>\n<p>Mais vous trouverez sur <a href=\"http:\/\/stackoverflow.com\/questions\/28618960\/node-0-12-0-marklogic-8\">stackoverflow<\/a> et sur le <a href=\"https:\/\/github.com\/marklogic\/node-client-api\/issues\/132\">github marklogic<\/a> de quoi vous\u00a0rassurer.<\/p>\n<h1>Premiers essais<\/h1>\n<p>Vos\u00a0premiers essais seront bas\u00e9s sur le document \u00ab\u00a0<a href=\"http:\/\/developer.marklogic.com\/learn\/node-client-api\">Getting Started with the Node Client API<\/a>\u00a0\u00bb du site Marklogic.<\/p>\n<p>Le code est simple, lisible. Il suffit de charger le client marklogic, la configuration de connexion plac\u00e9e dans un fichier js, et d&rsquo;appeler une m\u00e9thode de connexion.<\/p>\n<pre class=\"theme:twilight lang:js decode:true javascript\">var marklogic = require(\"marklogic\");\r\nvar conn = require(\".\/env.js\").connection;\r\n\r\nvar db = marklogic.createDatabaseClient(conn);<\/pre>\n<p>Ensuite, on ins\u00e8re un ou plusieurs documents dans la base via :<\/p>\n<pre class=\"theme:twilight lang:js decode:true \">db.documents.write(object(s))<\/pre>\n<p><span style=\"line-height: 1.5;\">La seule chose qui me g\u00e8ne un peu est la syntaxe utilis\u00e9e pour la r\u00e9cup\u00e9ration des r\u00e9sultats :\u00a0<\/span><\/p>\n<pre class=\"theme:twilight lang:js decode:true \">db.documents.write(object(s)).result(callback-ok, callback-err);<\/pre>\n<p>L\u00e0 o\u00f9 l&rsquo;impl\u00e9mentation monk\/mongoDB propose une syntaxe qui me semble plus classique pour node.js (mais je suis nouveau dans ce domaine) :<\/p>\n<pre class=\"theme:twilight lang:default decode:true\">collection.insert(object, callback);<\/pre>\n<h1>Ingestion de documents JSON dans la base<\/h1>\n<p>Voici le code qui me sert \u00e0 faire ing\u00e9rer \u00e0 Marklogic des lots de documents stock\u00e9s dans des fichiers JSON dont le chemin est pass\u00e9 en param\u00e8tre du script. Chaque fichier contient un array d&rsquo;objets.<\/p>\n<pre class=\"theme:twilight lang:js decode:true\">var marklogic = require(\"marklogic\");\r\nvar conn = require(\".\/env.js\").connection;\r\nvar fs = require('fs');\r\n\r\n\/\/ r\u00e9cup\u00e8re le param\u00e8tre = chemin du fichier json contenant les documents\r\nif (process.argv.length &lt; 3)\r\nreturn console.log(\"missing file path\")\r\nfile = process.argv[2];\r\n\r\n\/\/ lit le ficher enti\u00e8rement.\r\n\/\/ pas de stream pour pouvoir facilement d\u00e9composer l'array\r\nfs.readFile(file, 'utf8', function(err, jsondata){\r\nif (err) {\r\nreturn console.log(err);\r\n}\r\n\/\/ cr\u00e9e la connexion MArklogic\r\nvar db = marklogic.createDatabaseClient(conn);\r\n\/\/ transforme les donn\u00e9es du ficher en array\r\ndata = JSON.parse(jsondata)\r\n\/\/ sauve chaque \u00e9l\u00e9ment de l'array, avec ses m\u00e9tadonn\u00e9es\r\ndb.documents.write(\r\ndata.map(function(item) {\r\nreturn {\r\nuri: \"\/\" + item.fr.uuid + \".json\",\r\ncontentType: \"application\/json\",\r\ncollections: [\"uc-films\"],\r\ncontent: item\r\n}\r\n})\r\n)\r\n\/\/ message d'erreur\r\n.result(null, function(error) {\r\nconsole.log(JSON.stringify(error));\r\n});\r\n});<\/pre>\n<p>L&rsquo;uri de chaque item est ici le contenu de le la propri\u00e9t\u00e9 uuid de l&rsquo;objet fr. A vous d&rsquo;adapter \u00e0 votre format d&rsquo;import.<\/p>\n<h1>Test avec qconsole<\/h1>\n<p>Dans un browser, ouvrez http:\/\/localhost:8000\/qconsole et entrez comme query :<\/p>\n<pre class=\"theme:twilight lang:python decode:true \">xquery version \"1.0-ml\";\r\ncts:search(\/fr\/name,cts:collection-query(\"uc-films\"))<\/pre>\n<p>Dans mon cas, j&rsquo;obtiens une liste de titres de films, ce qui illustre la possibilit\u00e9 de requ\u00eater des documents JSON avec des requ\u00eates XQuery (ici une simple expression XPath). Sympa, non ? Vous trouverez plus de d\u00e9tails sur le maniement de JSON dans Marklogic sur la page <a href=\"https:\/\/docs.marklogic.com\/8.0\/guide\/app-dev\/json\">Working with JSON<\/a>\u00a0de la documentation Marklogic.<\/p>\n<p>A vous d&rsquo;adapter le chemin XPath \u00e0 votre format de document.<\/p>\n<h3>R\u00e9f\u00e9rence<\/h3>\n<p>\u00ab\u00a0<a href=\"http:\/\/docs.marklogic.com\/8.0\/guide\/node-dev\">Node.js Application Developer&rsquo;s Guide<\/a>\u00ab\u00a0.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le SGBD NoSQL Marklogic 8 dispose d&rsquo;une API Node.js, qui permet de d\u00e9velopper rapidement de petites (ou puissantes ?) applications Web. Partons du principe que vous avez install\u00e9 Node.js (version 0.12.7) le jour o\u00f9 j&rsquo;\u00e9cris ces lignes, et que vous commencez \u00e0 savoir vous en servir.\u00a0Vous trouverez sur le What&rsquo;s new de Marklogic 8 une&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-107","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.fluxnumerique.fr\/index.php?rest_route=\/wp\/v2\/posts\/107","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fluxnumerique.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fluxnumerique.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fluxnumerique.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fluxnumerique.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=107"}],"version-history":[{"count":3,"href":"https:\/\/www.fluxnumerique.fr\/index.php?rest_route=\/wp\/v2\/posts\/107\/revisions"}],"predecessor-version":[{"id":110,"href":"https:\/\/www.fluxnumerique.fr\/index.php?rest_route=\/wp\/v2\/posts\/107\/revisions\/110"}],"wp:attachment":[{"href":"https:\/\/www.fluxnumerique.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fluxnumerique.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fluxnumerique.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}