我正在尝试从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;
不起作用!
答案 0 :(得分:1)
你的最终console.log("outer xox is"+xox);
没有被解雇,因为它在调用client.search()
后立即执行,因为该调用是异步的,并且不会阻止执行继续执行该函数。发生这种情况时,xox
将undefined
,如果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 =
,或将其更改为其他变量名称,您应该看到它正常运行。