Я пытаюсь просто получить вставленный элемент, отредактировать его и снова обновить. К сожалению, все идет не так гладко.
Код еще не завершен и используется только для POC, не используйте его в работе, если вы собираетесь его скопировать:).
Моя функция создания, которая работает нормально:
async create(index: string, obj: any, id: string): Promise<TModel> {
let req: RequestParams.Create<TModel> = {
body: obj,
index: index,
id: id,
};
try {
var result = await this.client.create(req, {
ignore:[409]
});
if (result.statusCode === 201) {
return result.body;
} else {
console.log("Non succesfull call, result:", result);
return null;
}
} catch (error) {
console.log("create error", error);
return null;
}
}
Моя функция обновления, которая работает примерно так же
async update(index: string, obj: any, id: string): Promise<TModel> {
try {
let req: RequestParams.Update<TModel> = {
body: obj,
index: index,
id: id
};
var result = await this.client.update(req);
if (result.statusCode === 200 || result.statusCode === 201 || result.statusCode == 202 || result.statusCode == 204) {
return result.body;
} else {
console.log("Non succesfull call, result:", result);
return null;
}
} catch (error) {
console.error("Error updating", error);
}
}
Функция поиска, с которой я начал:
async search(index: string, searchBody: any): Promise<any> {
try {
var result = await this.client.search({
index: index,
body: searchBody
});
if (result.statusCode === 200) {
return result.body.hits.hits;
} else {
console.log("Non succesfull call, result:", result);
return null;
}
} catch (error) {
console.log("Error getting result", error);
return null;
}
}
При вставке и последующем поиске объекта вы, конечно, получаете тип возврата any
. Зная, как структурированы данные, где-то я делаю следующее только для быстрого тестирования:
return result.body.hits.hits[0]._source
Что дает мне в результате:

Хотя JSON-формат объекта кажется правильным, так же, как я его создал, он выдает ошибку при обновлении данных:

Поэтому я гуглил и пытаюсь применить это решение, предоставленное самим эластиком:
https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/typescript.html
Поиск кода:
async searchTyped(index: string, searchBody: any): Promise<TModel> {
try {
let req : RequestParams.Search<TModel> ={
index : index,
body : searchBody,
};
var result : ApiResponse<SearchResponse<TModel>> = await this.client.search(req);
if (result.statusCode === 200) {
if(result.body.hits.hits.length > 0){
return result.body.hits.hits[0]._source;
}
return null;
} else {
console.log("Non succesfull call, result:", result);
return null;
}
} catch (error) {
console.log("Error getting result", error);
return null;
}
}
Согласно intellisense, это должно работать, _source
должно быть типа TModel
.

К сожалению, не повезло:

Нахожусь ли я на правильном пути, чтобы убедиться, что объекты данных верны перед обновлением?
Мы хотели бы придерживаться динамического отображения и не определять точную модель, которая необходима. Я предполагаю, что при такой настройке не имеет значения, что тело запроса содержит javascript Object
или тип машинописного текста?