简体   繁体   中英

Indexing user query with Appbaseio and ReactiveSearch

I'm attempting to index a user's query using ReactiveSearch's DataSearch component and appbase-js.

So I've made my Node/Express app for appbase-js interaction with appbaseio. in app.js:

...
const search = require('./routes/search');
...
app.use('/api/search', search);

Then here is my search.js

const express = require('express');
const Appbase = require('appbase-js');

// create an appbase.io app's instance
const appbaseRef = new Appbase({
  url: "https://scalr.api.appbase.io",
  app: "index-query",
  credentials: "####-####"
});

const router = express.Router();

/* GET search. */
router.get('/test', (req, res, next) => {
  res.send('This is the SEARCH route - and it WORKS!');
});


router.post('/query', (req, res, next) => {
  appbaseRef.index({
    type: "autocomplete",
    body: value
  }).then('data', response => {
    console.log("@index success: ", response);
  }),('error', error => {
    console.log("@index error: ", error);
  });
});

module.exports = router;

Then here is my DataSearch component:

<DataSearch
   componentId="SearchSensor"
   dataField={["suggestions"]}
   className="search-bar"
   iconPosition="right"
   innerclassName={{
     list: "text-item"
   }}
   onValueSelected{
     (value) => {
      ????
      }
   } 
  />

I was advised in another question not do this :

onValueSelected={(value) => {
    fetch('YOUR_SERVER_URL' or 'Elasticsearch URL', { method: 'POST', body: {...} })
  }

So as not to expose sensitive information on the client

I'm not sure how to get value (the user's query) from my React front end to my Node/Express backend so that it can be indexed to ES app on Appbaseio?

Say your server is hosted at 'SERVER_URL' , the key is to send the data from the frontend to the server via a fetch request:

<DataSearch
  ...
  onValueSelected={(value) => {
    fetch('SERVER_URL/api/search/query', {
      method: 'POST',
      body: JSON.stringify({ value })
    }).then(() => handle response client side))
  }}
/>

Then you can add the body-parser middleware in express .

app.use(bodyParser.json())

In your route you can use the value from body and index it to elasticsearch. You can use the index method from appbase-js which you're using here.

router.post('/query', (req, res, next) => {
  appbaseRef.index({
    type: "autocomplete",
    body: { value: req.body.value }
  }).then('data', response => {
    console.log("@index success: ", response);
  }),('error', error => {
    console.log("@index error: ", error);
  });
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM