Elasticsearch NodeJS:无法正常返回

时间:2016-02-11 21:59:40

标签: javascript node.js elasticsearch elasticsearch-2.0

我正在尝试从elasticsearch查询返回结果。这是我的网页

<!DOCTYPE html>
 <html>

  <head>
   <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
  </head>

 <script>
 $(document).ready(function() {
 $('#ping-button').click(function(e) {
    e.preventDefault();

    var val;
    $.ajax({
        type: 'POST',
        url: 'http://localhost:6002/esPingTest',
        success: function(data){
        alert(data);
        alert("Yay");
        val=data;
        document.getElementById("demo").innerHTML = val;
        },
        error: function(){
        alert("Nay");
        }
    });


});
});
 </script>
<body>


<center>
<button id='ping-button'>Ping</button>
<br><br>
<p id="demo"></p>
</center>
</body>
</html>

所以我有一个按钮,当我点击它时,它应该转到esPingTest方法。

这是我的app.js

var express = require('express');
var app = express();
var cfenv = require('cfenv');
var bodyParser = require('body-parser');
var port = (process.env.VCAP_APP_PORT || 3000);
var host = (process.env.VCAP_APP_HOST || 'localhost');

// Create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })

app.use(express.static('elastic'));

var appEnv = cfenv.getAppEnv();

//start server on the specified port and binding host
var server = app.listen(appEnv.port, '0.0.0.0', function() {

      console.log("server starting on " + appEnv.url);
    })

app.get('/index.html', function (req, res) {
   res.sendFile( __dirname + "/" + "index.html" );
})


app.post('/esPingTest', urlencodedParser, function (req, res) {

   console.log("Ping");
   docs = getEsDocs()
   console.log(docs)
   res.end(JSON.stringify(docs));
})

function getEsDocs()
{
    var elasticsearch = require('elasticsearch');
    var client = elasticsearch.Client({
      host: 'localhost:9200',
      log: 'trace'
    });

    client.ping({
      // ping usually has a 3000ms timeout
      requestTimeout: Infinity,

      // undocumented params are appended to the query string
      hello: "elasticsearch!"
    }, function (error) {
      if (error) {
        console.trace('Elasticsearch cluster is down!');
        return "Error:Elasticsearch cluster is down!"
      } else {
        console.log('All is well');
        ff = getmeres(client);
        console.log("ping")
        console.log(ff)
        return ff
        //alert("YAY");
      }
    });

    function getmeres(client)
    {

        var xox =
        client.search({
              index: 'researchtest',
              body: {

                      "aggs": {
                        "docs": {
                          "terms": {
                            "field": "DocumentID"
                          }
                        }
                      }

              }
            }, function (error, response) {
                if (error) {
                    console.trace('Search query failed');
                    return "Error:Search query failed"
                  } else {
                    console.log('All is well');
                    d=response;
                    console.log("getmeres");
                    x=showdocs(d);
                    console.log("inner xo is"+xo);
                    var xo=x;
                    console.log("inner xo is"+xo);

                  }
            });
        console.log("outer xox is"+xox);
        return xox;
    }


    function showdocs(d){
        da=d.hits.hits
        var docs=[]
        for (i=0;i<da.length;i++)
        {   
            docs.push(da[i]["_source"]["DocumentID"]);
        }
        console.log("showdocs")
        console.log(docs)
        return docs;
    }

}

所以我在showdocs()函数的else条件中调用client.search函数

最后我看不到因return xo

而返回的任何值

这是我得到的结果

getmeres
showdocs
[ '12',
  '12',
  '23' ]
inner xo is[object Object]
inner xo 12,12,23

如何在作业xo=x之后获得xo的值?

为什么最后console.log("outer xox is"+xox);根本没有打印?

我无法弄清楚如何将结果返回到我的网页

修改

感谢@peteb的回答。现在这是我的电话

var ff =  getmeres(client, function getmeresResult(err, result){
              if (err) return err;
              console.log("Got res "+result);
              return result;          
            });
        console.log("ping")
        console.log(ff)
        return ff;

getmeres正如您所建议的那样。现在我得到

showdocs     [&#39; 12&#39;,       &#39; 12&#39 ;,       &#39; 23&#39; ]     得到了12,12,23

太棒了!但它仍然没有将值分配回ff。我需要将ff返回getEsDocs

我应该以与getEsDocs相同的方式致电getmeres吗?有回调?如果是这样,以下呼叫将起作用

docs = getEsDocs(function getDocResult(err, result){
      if (err) return err;
      console.log("Got doc "+result);
      return result;          
    })
   console.log(docs)
   res.end(JSON.stringify(docs));

差不多

再次感谢,我想我差不多了

这是我的第一个电话

getEsDocs(function getDocResult(err, result){
      if (err) return err;
      console.log("Got doc "+result);
      res.end(JSON.stringify(result));
      return result;          
    })

这是我的第二次电话

function getEsDocs(callback)
{
    var elasticsearch = require('elasticsearch');
    var client = elasticsearch.Client({
      host: 'localhost:9200',
      log: 'trace'
    });

    client.ping({
      // ping usually has a 3000ms timeout
      requestTimeout: Infinity,

      // undocumented params are appended to the query string
      hello: "elasticsearch!"
    }, function (error) {
      if (error) {
        console.trace('Elasticsearch cluster is down!');
        return "Error:Elasticsearch cluster is down!"
      } else {
        console.log('All is well');
        return callback(null, getmeres(client, function getmeresResult(err, result){
              if (err) return err;
              console.log("Got res "+result);
              return result;          
            }));
      }
    });

它仍会打印

showdocs
    [ '12',
      '12',
      '23' ]
    Got res 12,12,23

我错过了什么?

所以这就是我所拥有的,正如你所建议的那样

app.post('/esPingTest', urlencodedParser, function (req, res) {

   console.log("Ping");
   getEsDocs(function getEsDocsResult(err, result) {
        if (err) return res.status(400).json(result);
        console.log("Got doc"+result)
        return res.status(200).json(result); 
      });

});

function getEsDocs(callback)
{
    var elasticsearch = require('elasticsearch');
    var client = elasticsearch.Client({
      host: 'localhost:9200',
      log: 'trace'
    });

    client.ping({
      // ping usually has a 3000ms timeout
      requestTimeout: Infinity,

      // undocumented params are appended to the query string
      hello: "elasticsearch!"
    }, function (error) {
      if (error) {
        console.trace('Elasticsearch cluster is down!');
        return "Error:Elasticsearch cluster is down!"
      } else {
        console.log('All is well');
        return callback(null, getmeres(client, getmeresResult));
        function getmeresResult(err, result)
        {
              if (err) return err;
              console.log("Got res "+result);
              return result;          
            }
      }
    });


}

但我仍然没有看到最后的回报!你能看到任何错误吗?

所以基本上这个回归

if (err) return err;
              console.log("Got res "+result);
              return result;  

不起作用!

2 个答案:

答案 0 :(得分:1)

你的最终console.log("outer xox is"+xox);没有被解雇,因为它在调用client.search()后立即执行,因为该调用是异步的,并且不会阻止执行继续执行该函数。发生这种情况时,xoxundefined,如果console.log()尝试打印的内容与undefined连在一起,则getmeres()将不会打印。

您当前的undefined实施将始终返回client.search(),因为您从回调外部返回,而不是处理getmeres()的结果,然后返回该值从回调中调用者。

您可以通过将回调函数作为参数并使用结果返回回调来获取getmeres()之外的值。请参阅以下示例,并将第一个回调错误视为function getmeres(client, callback) { client.search({ index: 'researchtest', body: { "aggs": { "docs": { "terms": { "field": "DocumentID" } } } } }, function (error, response) { if (error) return callback(error, null); // returns the callback with the error that happened return callback(null, showdocs(response)); // returns the result of showdocs(response) }); 的第二个参数。

getmeres()

使用回调作为第二个参数调用getmeres(client, function getmeresResult(err, result) { if (err) return err; return result; }); 的示例

var elasticsearch = require('elasticsearch');

require()app.post('/esPingTest', urlencodedParser, function (req, res) { getEsDocs(function getEsDocsResult(err, result) { if (error) return res.status(400).json(result); return res.status(200).json(result); }); }); function getEsDocs(callback) { var client = elasticsearch.Client({ host: 'localhost:9200', log: 'trace' }); client.ping({ // ping usually has a 3000ms timeout requestTimeout: Infinity, // undocumented params are appended to the query string hello: "elasticsearch!" }, function (error) { if (err) return callback(error, null); return callback(null, getmeres(client, getmeresResult)); function getmeresResult(err, result) { if (err) return err; return result; }); }); 语句是同步的,你不应该把它放在getEsDocs里面,因为每当这条路线被命中时,你将阻止运行你的快递的主线程正在处理的所有操作服务器

将值返回到路线:

{{1}}

答案 1 :(得分:0)

问题很可能是您多次使用xo。失败的行正在尝试将xo的值重新分配给x,而您仍然在函数调用内部,该函数调用应该返回一个值xo。如果您在开头摆脱var xo =,或将其更改为其他变量名称,您应该看到它正常运行。