2015-01-09 28 views
1

下面是一段時間以來一直讓我瘋狂的事情。我正在開發一個涉及使用Javascript訪問ElasticSearch的項目。作爲測試的一部分,我想創建一個索引。這裏是一個非常簡單的片斷,在我腦海裏,應該這樣做,並打印從ElasticSearch服務器返回的消息:使用ElasticSearch javascript客戶端創建索引,承諾不會返回

var es = require('elasticsearch'); 

var es_client = new es.Client({host: "localhost:9200"}); 
var breaker = Math.floor((Math.random() * 100) + 1); 

var create_promise = es_client.indices.create({index: "test-index-" + breaker}); 
create_promise.then(function(x) { 
    console.log(x); 
}, function(err) { console.log(err);}); 

當我去到一個目錄下會出現什麼情況,運行npm install elasticsearch,然後運行該代碼與NodeJS一樣,是請求已經完成,但由於某種原因,承諾不會返回。我希望這段代碼能夠運行到最後,並在ES服務器的響應回來後完成。相反,這個過程只是掛起。任何想法爲什麼?

我知道索引可以通過添加一個文檔來創建,但是這個奇怪的行爲只是給我造成了困擾,而我無法弄清楚它背後的原因或意義。

+0

可能的重複[如何將現有的回調API轉換爲承諾](http://stackoverflow.com/questions/22519784/how-do-i-convert-an-existing-callback-api-to-promises ) –

+0

看完源代碼後,我幾乎可以肯定這是一個錯誤 - 請在github上的跟蹤器中打開一個問題 –

回答

1

默認情況下,客戶端保持與elasticsearch的持續連接,以便後續對同一節點的請求速度更快。這具有防止節點正常關閉的副作用,直到調用client.close()。您可以將此添加到您的回調中,或者通過將keepAlive: false添加到您的客戶端配置中來禁用keepAlive連接。