绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
将Algolia连接到Cosmic JS以实现出色的搜索功能
2022-06-02 10:22:39

使用Cosmic JS的Webhooks,我们可以将AlgoliaCosmic JS同步, 以为我们的项目提供快速而强大的搜索功能。

TL; DR

演示版 
源代码

介绍

如果您曾经尝试自己实施搜索,那么您就会知道这很困难。 值得庆幸的是,阿尔戈利亚(Algolia)创造了一种简化产品。 在本文中,我们将介绍如何将Algolia连接到Cosmic JS后端并将其添加到您的Apps。 该演示应用程序是使用React.js和Express.js服务器构建的。 如果您使用的是其他方法,则仍然可以遵循此模式。 只需针对您的用例进行修改。

主要有四个步骤:

  1. 创建一个Algolia应用
  2. 创建Cosmic JS Webhooks
  3. 创建API端点以接收Cosmic JS Webhook POST请求
  4. 将搜索小部件添加到我们的应用

第1部分-创建Algolia应用

导航至https://www.algolia.com 。 登录或注册(免费)帐户。

登录后,导航至仪表板。

在控制台中,单击“新建应用程序”。

为您的应用命名,然后单击“创建”。

下一页将要求您选择一个区域。 选择接近的一个。 然后点击“继续”。

现在,您应该看到新创建的应用程序的仪表板。 点击屏幕左侧的“ API密钥”。 这是后续步骤所需的API密钥列表。

第2部分-创建Cosmic JS Webhooks

登录到您的Cosmic JS帐户,然后转到“存储桶”。

选择“设置”,然后在“仪表盘”菜单中选择“ Webhooks”。

您应该连接三个不同的Webhooks。 将端点替换为项目所需的任何对象

  1. 事件:对象的创建和发布; 端点https://<__YOUR_DOMAIN__>/api/algolia/create
  2. 对象的编辑和发布; 端点https://<__YOUR_DOMAIN__>/api/algolia/edit
  3. 对象已删除; 端点https://<__YOUR_DOMAIN__>/api/algolia/delete

点击“保存Webhooks”。 现在,无论何时创建,编辑或删除对象,您的服务器都会收到POST请求。 下一步是设置服务器以接收这些请求,并使用它们保持Algolia同步。

第3部分-创建API端点以接收Cosmic JS Webhook POST请求

演示应用程序使用Node.js Express服务器。 这是代码:

  1. /* eslint-disable no-console */
  2. require ( 'dotenv' ).config({ path : './.env.production' });
  3. const express = require ( 'express' );
  4. const bodyParser = require ( 'body-parser' );
  5. const corser = require ( 'corser' );
  6. const next = require ( 'next' );
  7. const routes = require ( './routes' );
  8. const algoliasearch = require ( 'algoliasearch' );
  9. const convertDataToAlgoliaObject = require ( './utils/convertDataToAlgoliaObject' );
  10. const fetch = require ( 'isomorphic-fetch' );
  11. const port = parseInt (process.env.PORT, 10 ) || 3000 ;
  12. const dev = process.env.NODE_ENV !== 'production' ;
  13. const app = next({ dev });
  14. const handler = routes.getRequestHandler(app);
  15. const client = algoliasearch(
  16. process.env.ALGOLIA_APPLICATION_ID,
  17. process.env.ALGOLIA_ADMIN_API_KEY,
  18. );
  19. const itemsIndex = client.initIndex( 'items' );
  20. app.prepare()
  21. .then( () => {
  22. const server = express();
  23. server.use(corser.create());
  24. server.use(bodyParser.json());
  25. // ---------- API endpoints for synchronizing Algolia -----------
  26. server.post( '/api/algolia/create' , (req, res) => {
  27. const { data } = req.body;
  28. if (data.type_slug === 'items' ) {
  29. const algoliaObject = convertDataToAlgoliaObject(data);
  30. itemsIndex.addObject(algoliaObject)
  31. .catch( err => console .error(err));
  32. }
  33. res.status( 200 ).send();
  34. });
  35. server.post( '/api/algolia/edit' , (req, res) => {
  36. const { data } = req.body;
  37. if (data.type_slug === 'items' ) {
  38. const algoliaObject = convertDataToAlgoliaObject(data);
  39. itemsIndex.addObject(algoliaObject)
  40. .catch( err => console .error(err));
  41. }
  42. res.status( 200 ).send();
  43. });
  44. server.post( '/api/algolia/delete' , (req, res) => {
  45. const { data } = req.body;
  46. // data is an Array of one or more Object _ids
  47. itemsIndex.deleteObjects(data)
  48. .catch( err => console .error(err));
  49. res.status( 200 ).send();
  50. });
  51. server
  52. .listen(port, (err) => {
  53. if (err) throw err;
  54. console .log( `> Ready on http://localhost: ${port} ` );
  55. });
  56. });

首先,创建一个algoliasearch客户。 它使用Algolia应用程序ID和Admin API密钥(可以在您的Algolia App仪表板中找到)。

然后,为我们希望从Cosmic JS接收的每个Webhook创建端点。 Webhook POST请求包括对象及其主体。 自定义的“ convertDataToAlgoliaObject”实用程序函数用于将该Cosmic JS对象转换为针对Algolia格式化的对象。 这是“ convertDataToAlgoliaObject”的代码:

  1. const convertDataToAlgoliaObject = ( data ) => {
  2. let asin;
  3. let brand;
  4. let categories;
  5. let featured;
  6. let price;
  7. let thumbnail;
  8. data.metafields.forEach( ( metafield ) => {
  9. switch (metafield.key) {
  10. case 'asin' :
  11. asin = metafield.value;
  12. break ;
  13. case 'brand' :
  14. brand = metafield.value;
  15. break ;
  16. case 'categories' :
  17. categories = metafield.value && metafield.value.split( ',' );
  18. break ;
  19. case 'options' :
  20. featured = metafield.value.includes( 'Featured' );
  21. break ;
  22. case 'price' :
  23. price = metafield.value;
  24. break ;
  25. case 'thumbnail' :
  26. thumbnail = metafield.value;
  27. break ;
  28. default :
  29. // Do nothing
  30. }
  31. });
  32. return {
  33. asin,
  34. brand,
  35. categories : categories || [],
  36. content : data.content,
  37. createdAt : data.created_at,
  38. featured,
  39. modifiedAt : data.modified_at,
  40. objectID : data._id, // eslint-disable-line no-underscore-dangle
  41. price,
  42. publishedAt : data.published_at,
  43. slug : data.slug,
  44. thumbnail,
  45. title : data.title,
  46. };
  47. };
  48. module .exports = convertDataToAlgoliaObject;

每个项目的此功能将有所不同。 您基本上只想提取将是“可搜索的”信息。

现在,可以使用Algolia的algoliaseasrch库上载,编辑或删除Algolia中的相应条目。

后端设置完成! 但是,您应该注意,在部署应用程序之前,不会进行任何同步。 您创建的自定义API端点尚不存在,因此Algolia Webhook POST请求将不会被拦截。

第4部分-将搜索小部件添加到我们的应用

Algolia不仅提供了很棒的搜索功能,还提供了许多可用于显示数据的库。 我将他们的React Instant Search库用于演示项目。 它提供了本质上即插即用的React组件。 您可以使用自己的CSS自定义样式。 该文档写得很好,因此无需在此处重复。

结论

希望本文对您有所帮助。 如果不清楚,请查看Cosmic JSAlgolia文档。 他们俩都很棒!

本文初出现在Cosmic JS网站上 。

From: https://hackernoon.com/connecting-algolia-to-cosmic-js-for-awesome-search-functionality-ca435b1f8326

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Algolia
创建时间:2022-04-27 15:22:58
Algolia
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • LCR_
    专家
戳我,来吐槽~