jjzjj

javascript - 基本 meteor 异步概念 : Submit an Email and Send Email

coder 2023-11-06 原文

我是 Meteor 框架的新手,从传统的响应和请求背景(以 NodeJS 异步回调方式)到 Meteor,很难理解它的概念。

我只是想建立一个登录页面,告诉我您的姓名和电子邮件地址。用户点击提交后,我希望将用户保存在数据库(MongoDB)中,并向 Mandrill 端点发送请求,以便 Mandrill 可以向该特定电子邮件地址发送电子邮件。

我在传统的响应和请求中的做法是这样的。用户提交他们的姓名和电子邮件地址,这将是一个 POST 请求到我的服务器,在我的服务器上,我的 ORM 将把它保存到数据库中,回调成功后,我向 Mandrill 发出请求发送电子邮件到这个特定的用户。

我现在在 Meteor 中的代码如下:

Template.welcome.events({
  'submit form': function(e) {
    e.preventDefault();

    var subscribe = {
      name: $(e.target).find('[name="name"]').val(),
      email: $(e.target).find('[name="email"]').val()
    };

    var errors = validateSubscribes(subscribe);
    if (Object.keys(errors).length > 0) {
      for (var type in errors) {
        toast(errors[type], 2000);
      }
      return;
    }

    Subscribes.insert(subscribe, function(error, result) {
      if (error)
        return toast("Oops, something is wrong, try again");

      if (result) {
        $(e.target).find('button:submit')
                   .attr("disabled", "disabled");
        $(e.target).find('[name="name"]')
                   .val("")
                   .attr("disabled", "disabled");
        $(e.target).find('[name="email"]')
                   .val("")
                   .attr("disabled", "disabled");

        return toast('Thank you for subscribing!', 3000);
      }
    });
  }
});

我的 Mandrill 代码如下(从 https://atmospherejs.com/wylio/mandrill 获取)

#server code
Meteor.Mandrill.sendTemplate({
    "key": "YOUR_MANDRILL_API_KEY", // optional, if you set it in with Meteor.Mandril.config() already
    "template_name": "YOUR_TEMPLATE_SLUG_NAME",
    "template_content": [
      {}
    ],
    "message": {
        "global_merge_vars": [
            {
                "name": "var1",
                "content": "Global Value 1"
            }
        ],
        "merge_vars": [
            {
                "rcpt": "email@example.com",
                "vars": [
                    {
                        "name": "fname",
                        "content": "John"
                    },
                    {
                        "name": "lname",
                        "content": "Smith"
                    }
                ]
            }
        ],
        "to": [
        {"email": email@example.com}
        ]
    }
});

此外,在集合上,我允许订阅

Subscribes = new Mongo.Collection('subscribes');

Subscribes.allow({
  insert: function(userId, subscribe) { return true; }
});

validateSubscribes = function(subscribe) {
  var errors = {},
      regExp = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

   if (!subscribe.name)
    errors.name = 'Please fill in a name';

  if (!subscribe.email || !regExp.test(subscribe.email))
    errors.email = 'Please fill in a valid email';

  return errors;
};

我有三个问题:

  • 为什么使用允许?为什么不使用 Meteor.method 和 Meteor.call?
  • 我应该把 mandrill 代码放在哪里?在回调里面?我认为 Meteor 编程风格应该是同步风格?
  • 我可以将我所有的验证逻辑放在这里,我的所有 jQuery UI 逻辑都可以放在这个提交表单事件中,单独单击。我可以看到它很快就会膨胀。是否有任何特定的方式来组织所有这些?

非常感谢您的回答。 Meteor 非常酷,我只需要稍微了解一下它。

基督徒

最佳答案

  1. 我们中的许多人专门使用 Meteor.Method。请参阅 Discover Meteor 博客以获得良好的起点。 https://www.discovermeteor.com/blog/meteor-methods-client-side-operations/ 就我而言,我插入的几乎每个文档都附加了日期戳和用户 ID,因此我必须使用方法,否则用户可以在客户端声明任意 ID。即使没有必要,它也只是一种更简单的思考方式,而不是在你的脑海中运行允许/拒绝逻辑(记住,1 TRUE,你就完蛋了)。这就是为什么有些人建议只使用拒绝,或安装另一个包...

  2. 服务器上的 Meteor 使用光纤,这使得代码看起来是同步的。 https://www.eventedmind.com/feed/nodejs-using-futures 我会通过将您的 insert 移动到 Meteor.method 来组织它。然后,我会使用您从客户端收集并在服务器上验证的文档调用 mandrill。 (IIRC Mandrill 需要一个 API key ,因此您可能无论如何都不希望它在客户端代码中出现)

  3. 查看 collection2 和简单架构。它避免了许多困惑的服务器端检查、选择和清理。学习曲线有点高,还有其他可靠的软件包,但这是非正式的 meteor 事实上的标准。

关于javascript - 基本 meteor 异步概念 : Submit an Email and Send Email,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28615670/

有关javascript - 基本 meteor 异步概念 : Submit an Email and Send Email的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  2. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  3. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  4. ruby-on-rails - 使用 HTTParty 的非常基本的 Rails 4.1 API 调用 - 2

    Rails相对较新。我正在尝试调用一个API,它应该向我返回一个唯一的URL。我的应用程序中捆绑了HTTParty。我已经创建了一个UniqueNumberController,并且我已经阅读了几个HTTParty指南,直到我想要什么,但也许我只是有点迷路,真的不知道该怎么做。基本上,我需要做的就是调用API,获取它返回的URL,然后将该URL插入到用户的数据库中。谁能给我指出正确的方向或与我分享一些代码? 最佳答案 假设API为JSON格式并返回如下数据:{"url":"http://example.com/unique-url"

  5. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  6. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  7. ruby-on-rails - Rails 基本 Base64 身份验证 - 2

    我正在尝试复制此GETcurl请求:curl-D--XGET-H"Authorization:BasicdGVzdEB0YXByZXNlYXJjaC5jb206NGMzMTg2Mjg4YWUyM2ZkOTY2MWNiNWRmY2NlMTkzMGU="-H"Content-Type:application/json"http://staging.example.com/api/v1/campaigns在Ruby中,通过电子邮件+apikey生成身份验证:auth="Basic"+Base64::encode64("test@example.com:4c3186288ae23fd9661c

  8. ruby - 在 Mechanize 中使用 JavaScript 单击链接 - 2

    我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan

  9. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

  10. javascript - jQuery 的 jquery-1.10.2.min.map 正在触发 404(未找到) - 2

    我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文

随机推荐