React(Next.js) + Elasticsearch の非同期処理

2022年6月21日

適当にElasticsearchの処理をまとめておいて、

const elasticsearch = require('elasticsearch');
const client = new elasticsearch.Client({
host: 'localhost:9200/',
log: 'trace'
});
const index_name = "memo";
const max_size = 100;

export async function save(type, data) {
    if(type[0] == "mode"){
        const update = await client.update({
            index: index_name,
            id: type[1],
            body: {
                doc:{
                    mode:data.mode,
                    find:data.find
                }
            }
          })
    }else if(type[0] == "memo"){
        const add = await client.index({
            index: index_name,
            body: {
                memo:{
                    message:data.message,
                    created:data.created
                }
            }
        })
    }
}

export async function load(type, str) {
    if(type == "mode"){
        const search = await client.search({
            index: index_name,
            body: {
                size : max_size,
                _source: ["mode","find"],
                query: {
                    "match_all": {}
                  }
                }
        })
        return createdata(search, type)
    }else if(type == "memo"){
        if(str==""){
            const search = await client.search({
                index: index_name,
                body: {
                    size : max_size,
                    _source: ["memo"],
                    query: {
                        "match_all": {}
                      }
                    }
            })
            return createdata(search, type)
        }else{
            const search = await client.search({
                index: index_name,
                body: {
                    size : max_size,
                    _source: ["memo"],
                    query: {
                        "match":  {
                            "memo.message": str
                        }
                      }
                    }
            })
            return createdata(search, type)
        }
    }
    
}

export async function del(data_id) {
    const del = await client.delete({
        index: index_name,
        id: data_id
    })
}

function createdata(params,key) {
    let datas = [];
    for(let i=0; i<params.hits.hits.length; i++){
        if(key=="mode"){
            var data = {mode:params.hits.hits[i]._source.mode, find:params.hits.hits[i]._source.find}
            if(data.mode){
                data["id"] = params.hits.hits[i]._id;
                datas.push(data);
            }
        }else{
            var data = params.hits.hits[i]._source[key];
            if(data){
                data["id"] = params.hits.hits[i]._id;
                datas.push(data);
            }
        }
        
    }
    return datas;
}

上記の関数を外から呼び出したりする。
ただし、async/await を普通に使おうとすると怒られるので、useEffectで包む。

import React, {useState, useEffect} from 'react'
import * as ELController from'./ELController'

const [mode, setMode] = useState({mode:'default',find:"", id:""})
    useEffect(
        () => {
            const f = async () => {
                const res = await ELController.load("mode", "")
                setMode(res[0])
            }
            f();
        },
        []
    );