Roy Tang

roytang.net

Programmer, engineer, scientist, critic, gamer, dreamer, and kid-at-heart.

Blog Notes Photos Links Archives About

Subscribe: RSS JSON

2017 November

  • I have a Marklogic 9 project that I'm configuring with Roxy. I've been following these examples: https://github.com/marklogic-community/roxy/wiki/Adding-Custom-Build-Steps

    Basically, I have a server-side JS function that I want to call after deploy content. I have something like this:

    # then you would define your new method

      def deploy_content
        # you can optionally call the original
        original_deploy_content
    
        # do your stuff here
        execute_query(%Q{
          xquery version "1.0-ml";
          xdmp:javascript-eval('var process = require("/ingestion/process.sjs"); process.postDeployContent();')
        },
        :db_name => @properties["ml.app-name"] + "-content")
    
      end
    

    The xquery being called here evaluates fine when executed via query console. But when I call ml local deploy content, I get the following error:

    ERROR: 500 "Internal Server Error"
    ERROR: <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <title>500 Internal Server Error</title>
        <meta name="robots" content="noindex,nofollow"/>
        <link rel="stylesheet" href="/error.css"/>
      </head>
      <body>
        <span class="error">
          <h1>500 Internal Server Error</h1>
          <dl>
            <dt>XDMP-MODNOTFOUND: var process = require("/ingestion/process.sjs"); process.postDeployContent(); -- Module /ingestion/process.sjs not found</dt>
            <dd></dd>
            <dt>in [anonymous], at 1:14 [javascript]</dt>
            <dd></dd>
            <dt>at 3:6,
    in xdmp:eval("var process = require(&amp;quot;/ingestion/process.sjs&amp;quot;); proce...") [javascript]</dt>
            <dd></dd>
            <dt>in /eval, at 3:6 [1.0-ml]</dt>
            <dd></dd>
          </dl>
        </span>
      </body>
    </html>
    

    Why is the module not found when running via xquery from app_specific.rb?

    Or... is there a better way to call a JS module function from here. Sorry, I'm not too familiar with the xquery side, so I just called a JS function instead.

2017 October

  • I'm trying out the Roxy deployer. The Roxy app was created using the default app-type. I setup a new ML 9 database, and I ran "ml local bootstrap" using the default ports (8040 and 8041)

    Then I setup a node application. I tried the following (sample code from https://docs.marklogic.com/jsdoc/index.html)

    var marklogic = require('marklogic');
    var conn = {
        host: '192.168.33.10',  
        port: 8040,
        user: 'admin',
        password: 'admin',
        authType: 'DIGEST'
    }
    
    var db = marklogic.createDatabaseClient(conn);
    
    db.createCollection(
      '/books',
      {author: 'Beryl Markham'},
      {author: 'WG Sebald'}
      )
    .result(function(response) {
        console.log(JSON.stringify(response, null, 2));
      }, function (error) {
        console.log(JSON.stringify(error, null, 2));
      });
    

    Running the script gave me an error like:

    $ node test.js
    {
      "message": "write document list: cannot process response with 500 status",
      "statusCode": 500,
      "body": "<error:error xsi:schemaLocation=\"http://marklogic.com/xdmp/error error.xsd\" xmlns:error=\"http://marklogic.com/xdmp/error\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <error:code>XDMP-IMPMODNS</error:code>\n  <error:name>err:XQST0059</error:name>\n  <error:xquery-version>1.0-ml</error:xquery-version>\n  <error:message>Import module namespace mismatch</error:message>\n  <error:format-string>XDMP-IMPMODNS: (err:XQST0059) Import module namespace http://marklogic.com/rest-api/endpoints/config does not match target namespace http://marklogic.com/rest-api/endpoints/config_DELETE_IF_UNUSED of imported module /MarkLogic/rest-api/endpoints/config.xqy</error:format-string>\n  <error:retryable>false</error:retryable>\n  <error:expr/>\n  <error:data>\n    <error:datum>http://marklogic.com/rest-api/endpoints/config</error:datum>\n    <error:datum>http://marklogic.com/rest-api/endpoints/config_DELETE_IF_UNUSED</error:datum>\n    <error:datum>/MarkLogic/rest-api/endpoints/config.xqy</error:datum>\n  </error:data>\n  <error:stack>\n    <error:frame>\n      <error:uri>/roxy/lib/rewriter-lib.xqy</error:uri>\n      <error:line>5</error:line>\n      <error:column>0</error:column>\n      <error:xquery-version>1.0-ml</error:xquery-version>\n    </error:frame>\n  </error:stack>\n</error:error>\n"
    }
    

    If I change the port to 8000 (the default appserver that inserts into Documents), the node function executes correctly as expected. I'm not sure if I need to configure anything else with the Roxy-created appserver so that it works with the node.js application.

    I'm not sure where the "DELETE_IF_UNUSED" part in the error message is coming from either. There doesn't seem to be any such text in the configuration files generated by Roxy.

    Edit: When accessing 192.168.33.10:8040 via the browser, I get a an xml with a similar error:

    <error:error xsi:schemaLocation="http://marklogic.com/xdmp/error error.xsd" xmlns:error="http://marklogic.com/xdmp/error" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <error:code>XDMP-IMPMODNS</error:code>
      <error:name>err:XQST0059</error:name>
      <error:xquery-version>1.0-ml</error:xquery-version>
      <error:message>Import module namespace mismatch</error:message>
      <error:format-string>XDMP-IMPMODNS: (err:XQST0059) Import module namespace http://marklogic.com/rest-api/endpoints/config does not match target namespace http://marklogic.com/rest-api/endpoints/config_DELETE_IF_UNUSED of imported module /MarkLogic/rest-api/endpoints/config.xqy</error:format-string>
      <error:retryable>false</error:retryable>
      <error:expr/>
      <error:data>
        <error:datum>http://marklogic.com/rest-api/endpoints/config</error:datum>
        <error:datum>http://marklogic.com/rest-api/endpoints/config_DELETE_IF_UNUSED</error:datum>
        <error:datum>/MarkLogic/rest-api/endpoints/config.xqy</error:datum>
      </error:data>
      <error:stack>
        <error:frame>
          <error:uri>/roxy/lib/rewriter-lib.xqy</error:uri>
          <error:line>5</error:line>
          <error:column>0</error:column>
          <error:xquery-version>1.0-ml</error:xquery-version>
        </error:frame>
      </error:stack>
    </error:error>
    

    If it matters, MarkLogic version is 9.0-3.1. It's a fresh install too.

    Any advice?