gpt4 book ai didi

rest - 重新验证功能到Elasticsearch客户的多种功能

转载 作者:行者123 更新时间:2023-12-03 01:55:24 25 4
gpt4 key购买 nike

我正在使用节点构建REST API,并重新进行与Elasticsearch数据库的通信。现在,当我删除一个对象时,我希望它可以对其他一些对象进行级联删除。我知道这不是 Elasticsearch 的真正用途,但请耐心等待。

所以这是我的代码:

function deleteHostname(req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
var endpoints = [];

client.search({
index: 'test',
type: 'something',
body: {
from: 0, size: 100,
query: {
match: {
hostname: 'www.test.com'
}
}
}
}).then(function (error, resp) {
if(error) {
res.send(error);
}

endpoints = resp.hits.hits;

for (index = 0, len = endpoints.length; index < len; ++index) {
client.delete({
index: 'test',
type: 'something',
id: endpoints[index]._id
}, function (error, response) {
if(error) {
res.send(error);
}
});
}

res.send(endpoints);
return next();
});
}

因此,基本上我只想搜索主机名为www.test.com的任何对象(我只是对此进行了硬编码以对其进行测试)。然后,我要删除找到的所有对象。它遵循错误路径并将此发送给我:
{  
"took":1,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"failed":0
},
"hits":{
"total":1,
"max_score":2.098612,
"hits":[
{
"_index":"test",
"_type":"something",
"_id":"123456",
"_score":2.098612,
"_source":{
"duration":107182,
"date":"2016-05-04 00:54:43",
"isExceptional":true,
"hostname":"www.test.com",
"eta":613,
"hasWarnings":false,
"grade":"A+",
"ipAddress":"ipip",
"progress":100,
"delegation":2,
"statusMessage":"Ready"
}
}
]
}
}

所以我认为这看起来不是错误?那么,为什么我要把它作为错误返回呢?如果我删除:
        if(error) {
res.send(error);
}

从我的代码中,我不会得到任何回应。

最佳答案

您需要像这样更改代码(请参阅左侧->表示的更改):

    if(error) {
1-> return res.send(error);
}

endpoints = resp.hits.hits;

for (index = 0, len = endpoints.length; index < len; ++index) {
2-> (function(id){
client.delete({
index: 'test',
type: 'something',
3-> id: id
}, function (error, response) {
if(error) {
4-> next(error);
}
});
5-> })(endpoints[index._id]);
}

6-> //res.send(endpoints);

我现在在解释每个更改:
  • 如果您不使用return,则会发送错误信息,然后继续处理匹配数据
  • (3/5)由于client.delete是异步函数,因此您需要在匿名函数
  • 中调用它
  • 如果发生错误,您需要调用next(error)而不是res.send
  • 由于您的for循环可能尚未终止,您目前无法发送响应。不应使用for循环,而应使用出色的 async 库(请参见下面的使用 asynch.each 的示例)

  • 异步示例:
        var async = require('async');
    ...

    if(error) {
    return res.send(error);
    }

    endpoints = resp.hits.hits;

    async.each(endpoints,
    function(endpoint, callback) {
    client.delete({
    index: 'test',
    type: 'something',
    id: endpoint._id
    }, callback);
    },
    // this is called when all deletes are done
    function(err){
    if (err) {
    next(err);
    } else {
    res.send(endpoints);
    next();
    }
    }
    );

    您可以通过 delete by query plugin来实现您想要的目标,这是另一个解决方案。该功能使您可以在单个查询中完成以上所有操作。

    如果您仍在使用ES 1.x,则按查询删除仍然是核心部分,您只需调用Javascript客户端的 deleteByQuery function

    如果您使用的是ES 2.x,则按查询删除现在是一个插件,因此您需要 install it,然后还需要Javascript客户端的 deleteByQuery扩展库
    function deleteHostname(req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', '*');

    client.deleteByQuery({
    index: 'test',
    type: 'something',
    body: {
    query: {
    match: { hostname: 'www.test.com' }
    }
    }
    }, function (error, response) {
    if (error) {
    next(error);
    } else {
    res.send(endpoints);
    next();
    }
    });
    }

    关于rest - 重新验证功能到Elasticsearch客户的多种功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37015960/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com