使用Appbaseio和ReactiveSearch索引用户查询

时间:2018-08-22 21:25:24

标签: node.js reactjs elasticsearch indexing reactivesearch

我正在尝试使用ReactiveSearch的DataSearch组件和appbase-js为用户的查询建立索引。

因此,我已经制作了Node / Express应用程序,用于与appbaseio进行appbase-js交互。 在app.js中:

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

然后这是我的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;

然后这是我的DataSearch组件:

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

有人建议我不这样做

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

以免在客户端上公开敏感信息

我不确定如何从React前端向Node / Express后端获取价值(用户查询),以便可以将其索引到Appbaseio上的ES应用程序中。

1 个答案:

答案 0 :(得分:0)

假设您的服务器托管在'SERVER_URL'上,关键是要通过fetch请求将数据从前端发送到服务器:

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

然后,您可以添加body-parser中间件in express

app.use(bodyParser.json())

在路线中,您可以将value用于正文,并将其index用于elasticsearch。您可以在此处使用的appbase-js中使用index方法。

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);
  });
});