Graphdb.js node.js одно соединение server.repository несколько запросов через Rest API - PullRequest
0 голосов
/ 04 ноября 2019

Я использую nodejs и graphdbjs. Мой вопрос заключается в том, могу ли я иметь один активный репозиторий и задать два запроса (полезные данные, как в данном случае), которые будут запускаться по требованию как REST APis. Например,

const server = new ServerClient(serverConfig);
const readTimeout = 30000;
const writeTimeout = 30000;
const repositoryClientConfig = new RepositoryClientConfig(['http://localhost:7200/repositories/V2'], {}, '', readTimeout, writeTimeout);
server.getRepository('V2',repositoryClientConfig).then(repository => {  
  repository.registerParser(new SparqlJsonResultParser());

    const payload = new GetQueryPayload()
      .setQuery('select * where {?s ?p ?o}')
      .setQueryType(QueryType.SELECT)
      .setResponseType(RDFMimeType.SPARQL_RESULTS_JSON)
      .setLimit(100);
    repository.query(payload).then((stream) => {
       stream.on('data', (bindings) => {
            var test = Object.values(bindings);
         var element = {id: test[0].id.replace(/['"]+/g, ''), name: test[1].id.replace(/['"]+/g, '')}
        });
        stream.on('end', () => {          
        restapp.get('/getallIDs', function(req,res)  {
        res.send(element);
        });
        restapp.listen(3000, function () {
             console.log('App listening on port 3000!');
        });
        }); 
});




const payload2 = new GetQueryPayload()
  .setQuery('select * where {?s ?p ?o}')
  .setQueryType(QueryType.SELECT)
  .setResponseType(RDFMimeType.SPARQL_RESULTS_JSON)
  .setLimit(100);
  repository2.query(payload2).then((stream2) => {
    stream2.on('data', (bindings2) => {
    var test2 = Object.values(bindings2);
    var i2=0;
    test2.forEach(function(key,value){
      if (i2%2==1){
      return true;}
      var element2 = {id: test2[0].id.replace(/['"]+/g, ''), name: test2[1].id.replace(/['"]+/g, '')}
      i++;
      head2.table.push(element2);
    });       
    });
    stream2.on('end', () => {
    restapp2.get('/getidby', function(req,res)  {
      res.send(head2);
    });
    restapp2.listen(3000, function () {
       console.log('App listening on port 3000!');
    });
    });       

Я хочу иметь только один сеанс и несколько полезных нагрузок, и в случае, если пользователь нажимает правильный URL-адрес, он возвращает что-то как json. На данный момент я получаю сообщение об ошибке, которое не могу объяснить:

{"level":"error","time":1572863035018,"name":"RDFRepositoryClient","repositoryUrl":"http://localhost:7200/repositories/V2","msg":"Cannot retry execution","v":1}
Error: Request failed with status code 400
    at createError (/home/estathop/eclipse-workspace/test/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/home/estathop/eclipse-workspace/test/node_modules/axios/lib/core/settle.js:17:12)
    at RedirectableRequest.handleResponse (/home/estathop/eclipse-workspace/test/node_modules/axios/lib/adapters/http.js:211:9)
    at RedirectableRequest.emit (events.js:210:5)
    at RedirectableRequest._processResponse (/home/estathop/eclipse-workspace/test/node_modules/follow-redirects/index.js:269:10)
    at ClientRequest.RedirectableRequest._onNativeResponse (/home/estathop/eclipse-workspace/test/node_modules/follow-redirects/index.js:50:10)
    at Object.onceWrapper (events.js:300:26)
    at ClientRequest.emit (events.js:210:5)
    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:583:27)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:115:17) 

Любая помощь в достижении того, что я пытаюсь сделать? Мой следующий шаг после этого - получение идентификатора из службы restful и формирование полезной нагрузки. Спасибо, извините, если мои вопросы пустые, но я новичок в этом поле

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

Насколько я понимаю, нет концептуальной проблемы с тем, чего вы пытаетесь достичь. Теперь, в соответствии с ошибкой, я думаю, что это может быть связано с запросами GET, которые вы выполняете против остальных. Api restapp.get('/getallIDs', function(req,res) {...} Можете ли вы подтвердить, что вызов repository.query (payload) возвращает правильный ответ? Я предполагаю, что вы можете просто поставить регистратор перед stream.on ('data') и посмотреть, распечатан ли он, что подтвердит, что запрос graphdbjs, вероятно, правильный. Я могу привести вам несколько улучшенный, но все еще похожий пример, который, похоже, правильно отображает результаты потокового запроса:

const {ServerClient, ServerClientConfig} = require('graphdbjs').server;
const {RepositoryClientConfig} = require('graphdbjs').repository;
const {RDFMimeType} = require('graphdbjs').http;
const {SparqlJsonResultParser} = require('graphdbjs').parser;
const {GetQueryPayload, QueryType} = require('graphdbjs').query;

const serverConfig = new ServerClientConfig('http://localhost:7200/', 0, {
    'Accept': RDFMimeType.SPARQL_RESULTS_JSON
});
const server = new ServerClient(serverConfig);
const readTimeout = 30000;
const writeTimeout = 30000;
const repositoryClientConfig = new RepositoryClientConfig(['http://localhost:7200/repositories/testrepo'], {}, '', readTimeout, writeTimeout);

server.getRepository('testrepo',repositoryClientConfig).then(function(repository) {  

    console.log('REPO:', repository);
    repository.registerParser(new SparqlJsonResultParser());

    const payload = new GetQueryPayload()
        .setQuery('select * where {?s ?p ?o}')
        .setQueryType(QueryType.SELECT)
        .setResponseType(RDFMimeType.SPARQL_RESULTS_JSON)
        .setLimit(100);
    return repository.query(payload);

})
.then(function(stream) {
    console.log('SELECT:');
    stream.on('data', function(bindings) {
        var test = Object.values(bindings);
        console.log('DATA');
        // var element = {id: test[0].id.replace(/['"]+/g, ''), name: test[1].id.replace(/['"]+/g, '')}
    });
    stream.on('end', function() {
        console.log('END');
        // restapp.get('/getallIDs', function(req,res)  {
        //     res.send(element);
        // });
        // restapp.listen(3000, function () {
        //     console.log('App listening on port 3000!');
        // });
    });
})
.catch(function(error) {
    console.log('ERROR', error);
});

И еще одна вещь, которую вы можете исправить, это вызов res.send(element);, который, как я вижу, на самом деле отправит undefined поскольку element находится в области действия в обратном вызове stream.on('data'. Таким образом, вы можете сделать его доступным, определив var element; перед stream.on('data' строкой.

1 голос
/ 05 ноября 2019

Лучший структурированный способ - иметь отдельные файлы, один из них - главный узел app.js

    var express = require('express');
var restapp = express();
var queryController = require('./controllers/queryController')

restapp.use(queryController)

restapp.listen(3001, function () {
    console.log('Αpp listening on port 3001!');
});

, и, как предполагается, вы импортировали queryController.js, который включает код, выполняющий каждый отдельный запросвам нужен сервер graphdb

var express = require('express');
var router = express.Router()

const {ServerClient, ServerClientConfig} = require('graphdb').server;
const {RDFMimeType} = require('graphdb').http;
const {RepositoryClientConfig} = require('graphdb').repository;
const {SparqlJsonResultParser} = require('graphdb').parser;
const {GetQueryPayload} = require('graphdb').query;
const {QueryType}= require('graphdb').query;
const serverConfig = new ServerClientConfig('http://localhost:7200', 0, {
    'Accept': RDFMimeType.SPARQL_RESULTS_JSON
});

router.get('/hi', (req, res) => {
      res.send('hi')
})



router.get('/getallids', (req, res) => {
    head = {};
    table = [];
    head.table = table;
    const server = new ServerClient(serverConfig);
    const readTimeout = 30000;
    const writeTimeout = 30000;
    const repositoryClientConfig = new RepositoryClientConfig(['http://localhost:7200/repositories/V2'], {}, '', readTimeout, writeTimeout);
    server.getRepository('V2',repositoryClientConfig).then(repository => {  
        repository.registerParser(new SparqlJsonResultParser());     
        const payload = new GetQueryPayload()
        .setQuery('select * where {?p ?o ?k}')
        .setQueryType(QueryType.SELECT)
        .setResponseType(RDFMimeType.SPARQL_RESULTS_JSON)
        .setLimit(100);
        repository.query(payload).then((stream) => {
                stream.on('data', (bindings) => {
                var test = Object.values(bindings);
                var i=0;
                test.forEach(function(key,value){
                    test2 = Object.values(key);
                    if (i%2==1){
                    return true;}
                    var element = {id: test[0].id.replace(/['"]+/g, ''), name: test[1].id.replace(/['"]+/g, '')}
                    i++;
                    head.table.push(element);
                });       
            });
            stream.on('end', () => {  
                    res.send(head);   
            });       
        }).catch(err => console.log(err));
    });
})


router.get('/getid/:id', (req, res) => {
    const params = req.params;
    head = {};
    table = [];
    head.table = table;
    const server = new ServerClient(serverConfig);
    const readTimeout = 30000;
    const writeTimeout = 30000;
    const repositoryClientConfig = new RepositoryClientConfig(['http://localhost:7200/repositories/V2'], {}, '', readTimeout, writeTimeout);
    server.getRepository('V2',repositoryClientConfig).then(repository => {  
        repository.registerParser(new SparqlJsonResultParser());     
        const payload = new GetQueryPayload()
        .setQuery('select'+Object.values(params)+'where {?p ?o ?k}')
        .setQueryType(QueryType.SELECT)
        .setResponseType(RDFMimeType.SPARQL_RESULTS_JSON)
        .setLimit(100);
        repository.query(payload).then((stream) => {
                stream.on('data', (bindings) => {
                var test = Object.values(bindings);
                var i=0;
                test.forEach(function(key,value){
                    test2 = Object.values(key);
                    if (i%2==1){
                    return true;}
                    var element = {key: test[0].id.replace(/['"]+/g, ''), value: test[1].id.replace(/['"]+/g, '')}
                    i++;
                    head.table.push(element);
                });       
            });
            stream.on('end', () => {
                    res.send(head);  
            });       
        }).catch(err2 => console.log(err2));
    });
})
module.exports = router;
...