繁体   English   中英

如何使用JavaScript Elasticsearch客户端错误?

[英]How to use the JavaScript Elasticsearch client errors?

我试图解析来自通过nodeJs Express路由调用的Elasticsearch客户端的错误。 我的情况是我想识别的超时错误。

我或多或少地实现了这样的事情:

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 ) );
})   

没有错误时,一切正常。 但是,当发生超时错误时, handleError()返回的函数中的断点将向我显示以下内容: 在此处输入图片说明

我从elastic.co错误文档中读取到存在标准错误。 如何使功能匹配文档中的错误? 我希望能够匹配例如RequestTimeout或InternalServerError。

在returnResponse和handleError中传递的res参数是在router.get( "/test", function ( req, res, next ) {传递的参数router.get( "/test", function ( req, res, next ) {因此它是undefined

来自Elasticsearch的报价

当回调传递给任何API方法时,将使用(错误,响应,状态)进行调用。 如果您更喜欢使用Promise,请不要传递回调,否则将返回Promise。 承诺将通过响应主体来解决,或者因发生的错误而被拒绝(包括针对任何非“存在”方法的300多个响应)。

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.
 });

注意:ElasticSearch中的状态码具有其自身的含义,请不要将其与HTTP状态码混淆。

注意:Javascript支持封闭范围,而不是块范围。

关于未定义的状态代码, ElasticSearch.JS中的状态代码定义似乎存在错误

@Spalger提供了有关如何使用JavaScript Elasticsearch客户端错误的解决方案?:

// 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')
  }
})

非常感谢@Spalger的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM