2016-04-11 2 views
0

Ich versuche, den Fehler vom Elasticsearch-Client zu analysieren, der über einen NodeJs Express-Routen aufgerufen wird. In meinem Fall ist es der Zeitüberschreitungsfehler, den ich identifizieren möchte.Wie verwendet man die Javascript Elasticsearch Client Fehler?

ich mehr oder weniger so etwas umzusetzen:

var client = new elasticsearch.Client({ 
    host: process.env.ELASTICSEARCHLOCATION, 
    requestTimeout:500, 
    maxRetries:1 
}); 

function returnResponse(response) { 
    return function (resp) { 
    //stringExtract 
    if (resp.hits && resp.hits.hits) { 
     response.status(200).send(resp.hits.hits); 
    }else{ 
     response.status(200).send([]); 
    } 
    }; 
} 

function handleError(response) { 
    return function(err){ 
    if (err.statusCode == 404) { 
     response.status(200).send([]); 
    } else { 
     console.error(err.message); 
     response.status(err.statusCode).send(err); 
    } 
    } 
} 
router.get("/test", function (req, res, next) { 
    log.data("route GET: ", "/wynsureSearch/test"); 
    log.request(req.url); 

    client .search({ 
    index: process.env.ELASTICSEARCHINDEX, //target the wynsure version aka the ES DB index 
    type: [], //target the wynsure types 
    body: req.body 
    }).then(returnResponse(res), handleError(res)); 
}) 

Alle funktioniert gut, wenn es keine Fehler gibt. Aber wenn ein Timeout-Fehler auftritt, zeigt der Haltepunkt in der Funktion zurück von handleError() mir dies: enter image description here

ich von elastic.co errors documentation gelesen, dass es standars Fehler. Wie kann ich meine Funktion mit den Fehlern aus der Dokumentation übereinstimmen? Ich möchte in der Lage sein, RequestTimeout oder InternerServerError zum Beispiel zu entsprechen.

Antwort

0

res Parameter übergeben in returnResponse und handleError bezieht sich auf den Parameter in router.get("/test", function (req, res, next) { übergeben daher ist es undefined.

Zitat Elasticsearch

Wenn ein Rückruf zu einem der API-Methoden übergeben wird, wird es mit (err, Antwort, Status) aufgerufen werden. Wenn Sie Versprechungen verwenden möchten, übergeben Sie keinen Rückruf und es wird ein Versprechen zurückgegeben. Das Versprechen wird entweder mit dem Antworttext aufgelöst oder mit dem aufgetretenen Fehler zurückgewiesen (einschließlich 300+ Antworten für nicht existierende Methoden).

client .search({ 
    index: process.env.ELASTICSEARCHINDEX, //target the wynsure version aka the ES DB index 
    type: [], //target the wynsure types 
    body: req.body }, function callback(err, response, status){ 
    if (err) { 
    if(status == 404) res.status(200).send(); 
    else console.error(err.message); 
    } 
    else res.status(200).send(response); // res variable is refering to HTTP response whereas response is the result returned from elasticsearch. 
}); 

Hinweis: Statuscodes in Elasticsearch hat ihre eigene Bedeutung, sie nicht mit HTTP-Statuscodes verwechseln.

Hinweis: Javascript unterstützt das Einschließen von Bereichen, nicht das Blockieren von Bereichen.

+0

Ich kann Ihnen versichern, dass 'res' nicht undefiniert ist. Ansonsten scheint alles gut mit meinen Callbacks zu funktionieren (inklusive Scopes inclusive);) –

0

In Bezug auf den undefinierten Statuscode scheint es eine bug with the status code definition in ElasticSearch.JS zu geben.

@Spalger bietet eine Lösung, wie man die JavaScript Elasticsearch Client Fehler mit ?:

// require the Error class 
var EsClientRequestTimeout = require('elasticsearch').errors.RequestTimeout; 

// ... somewhere else in your code 

client.search(..., function (err) { 
    if (err instanceof EsClientRequestTimeout) { 
    console.log('timeout') 
    } else { 
    console.log('not a timeout') 
    } 
}) 

Danke viel @Spalger für die Unterstützung!

Verwandte Themen