【问题标题】:ApostropheCMS: How to emit Events from Browser to ServerApostropheCMS:如何将事件从浏览器发送到服务器
【发布时间】:2018-04-02 20:16:39
【问题描述】:

我是 Apostrophe 的新手,我找不到客户端和服务器之间通信的解决方案。

我想从我的 MySQL 数据库中获取一些数据到我的 ApostropheCMS 中(我有一个超过 50k 行的大型数据库)。但是我找不到方法,如何在浏览器和服务器之间进行通信。

如果我从客户端发出一个事件,它只会在浏览器中触发 apos.on,而不是在服务器端。

我在文档中找不到任何答案,所以我真的需要帮助。

感谢所有回答

【问题讨论】:

  • 提供您尝试过的代码示例。
  • 就像 Alan 说的,一个代码示例会很有帮助。听起来您正在尝试在用户的浏览器和服务器之间建立通信。如果是这种情况,emit 就不会那样工作——它只会在触发它的那一侧工作(服务器 -> 服务器或浏览器 -> 浏览器)。当您需要从浏览器向服务器发送数据时,您需要实现一些可以接收数据的新路由/端点。这里有一个如何设置服务器侦听请求和浏览器发送请求的示例:apostrophecms.org/docs/tutorials/intermediate/forms.html
  • 感谢您的快速解答。 @Joseph 这是一个很好的方法。我只是想也许还有其他方法。但无论如何,谢谢,我认为这就是我要做的方式;)

标签: node.js apostrophe apostrophe-cms


【解决方案1】:

apos.emit 机制只是一个简单的事件总线(想想 jQuery 事件),用于在浏览器或服务器中使用,而不是在它们之间。

对于浏览器和服务器之间的消息传递,您当然可以使用 jQuery 和 Express 的所有常用机制,但有一些细节需要注意:

  • 在服务器端,在其中一个模块中设置路由的最简单方法通常是使用 route 方法:

self.route('post', 'do-cool-thing', function(req, res) { // here you can access req.body in the normal Express way, then... return res.send({ some: data, as: json }); }

如果你的模块被称为nifty,那么这个路由的URL就是/modules/nifty/do-cool-thing

不过,您也可以访问self.apos.app,这是 Express 应用程序对象。所以你可以写:

self.apos.app.post('/do-cool-thing', function(req, res) { ... });

创建不带/module/module-name 前缀的路由。

在浏览器端,您可以通过$.post$.ajax和朋友进行常规交流。或者,您可以使用我们的$.jsonCall 插件:

$.jsonCall('/do-cool-thing', { some: data, sentAs: json, for: you }, function(data) { // JSON response from the server, already parsed for you }, function(err) { // Oh dear, a communications error });

要记住的重要一点是,Apostrophe 具有内置的 CSRF 保护,可防止第三方网站诱骗用户在您的网站上执行操作。如果您使用 jQuery 的 AJAX 方法,包括我们的 jsonCall 插件,您将自动参与并且没有问题。如果您使用其他东西,例如 fetch,或者希望为世界其他地方创建 API,那么您需要注意这一点并添加 CSRF 异常。

有关详细信息,请参阅contact forms tutorial,其中详细介绍了这一点。

【讨论】:

  • 感谢您的快速答复。我希望您在文档上多做一些工作,因为对于像我这样的非半专业开发人员来说,大部分内容都很难理解。那是因为文档写得像“每个人都应该已经知道了,所以我不会告诉你更多”。 ApostropheCMS 是一种非常棒的方法,可以记录那么糟糕的文档。
  • 感谢您残酷的诚实。 (:您是从教程中获得这种感觉的?还是从您对这些特定信息的搜索中获得的?
  • 来自教程。 “入门”很酷,绝对没问题。但我错过了更多的背景信息。例如:您使用 nunjucks,这似乎很棒。但我从未使用过它,就像 mongodb 或 .less 而不是常规的 css。当我深入研究文档时,我并没有真正理解它,因为我是他们每个人的血腥初学者,所以我真的没有机会真正了解它们如何协同工作。更重要的是,我不明白撇号来自什么以及另一个解决方案来自什么。不过感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 2015-10-22
  • 1970-01-01
  • 2021-10-22
相关资源
最近更新 更多