Rails Twilio App 在运行时在heroku 中发送文本时挂起,但在heroku 上的rail 控制台中工作(以及在所有环境中的本地)

Posted

技术标签:

【中文标题】Rails Twilio App 在运行时在heroku 中发送文本时挂起,但在heroku 上的rail 控制台中工作(以及在所有环境中的本地)【英文标题】:Rails Twilio App hangs when sending text in heroku on run, but works in rail console on heroku (and locally in all environments) 【发布时间】:2016-11-29 22:57:30 【问题描述】:

我构建了一个twilio-powered rails app,它有一个方法可以发送带有参数的短信(to、from、body)。该应用程序在开发和生产模式下使用 ngrok 在本地运行良好。

Heroku 是另一回事。一旦到达构建文本消息的部分,它就不会越过它,并且日志不会显示任何问题。就像它停止了,twilio 在 15 秒后放弃了等待响应。这是发送短信的类:

需要'twilio-ruby'

class SmsActions
   def self.compose_message(to, from, body)

    account_sid = Rails.application.secrets.twilio_account_sid
    auth_token = Rails.application.secrets.twilio_auth_token

    @client = Twilio::REST::Client.new(account_sid, auth_token)

    message = @client.account.messages.create(
        from: from,
        to: to,
        body: body,
        statusCallback:  "http://fptracker.herokuapp.com/twilio/callback"
    )
end

我使用“puts”语句来记录并确认它看到了 account_sid 和 auth_token。同样的事情发现它在消息块下没有运行任何东西。

奇怪的是我可以运行 hoerku run rails,输入与发送文本完全相同的代码(对 account_sid 和令牌进行硬编码)并且它可以工作。

所以我不认为它缺少凭据,我不认为它是中间件(因为它在 heroku 中手动工作),它不是生产环境,因为它在生产中本地工作。我已经为此工作了 30 多个小时,完全被难住了。

--编辑 我注意到我的通知控制器顶部没有教程中所需的代码,例如:

require 'twilio-ruby'

class NotificationsController < ApplicationController
   include Webhookable

   after_filter :set_header

   skip_before_action :verify_authenticity_token

但添加后它仍然不起作用。

我注意到的第二件事是,当我将创建 SMS 的代码直接放在控制器中时,它可以在 heroku 上运行。我将该方法放在同一个notifications_controller 文件中的不同类中并调用它并且它可以工作。

但是当它被调用时,路径是这样的:

    路由命中通知#parse 解析以“test”开头的消息的正则表达式 解析方法然后调用模型方法Message.auto_reply Message.auto_reply 从 secrets 中获取我的 twilio 号码,并有一些 puts 语句,然后调用 SmsActions.compose_message compose message 是上面列出的类并创建文本消息。

所以 compose_message 是适用于本地环境但不适用于 heroku 的类。它确实受到了打击,因为日志显示了我放在那里的 puts 语句,但它在 heroku 中创建 Twilio 消息时冻结/停止。控制器和该方法之间发生了一些事情。

【问题讨论】:

这很奇怪,你在Twilio logs 中看到了什么吗? 好的,我注意到的一件事是我在调用它的控制器顶部没有所需的 twilio 代码。 哪个需要 Twilio 代码?这有什么不同吗? 对不起,我提前发送了该消息。我刚刚更新了问题以添加更多我在其中输入的信息。 当您使用puts 登录时,我看到您刚刚登录了您必须到达的位置(例如p 'client created')。您是否尝试过登录以确保正确设置您的帐户 sid 和身份验证令牌并注销以确保 client 对象看起来正确? 【参考方案1】:

解决了。它与 Twilio 完全没有关系,但是我在尝试创建文本消息时在“from”变量中传递了一个 nil 值。该值来自我的 ENV 变量

from = Rails.application.secrets.twilio_number

当从控制器内部调用时,它会成功地从环境变量中访问变量,但是当从控制器外部的任何地方调用时它是 nil。我还不知道为什么。所以下面的这个块会因为那个 nil 值而陷入困境,但是 heroku 日志中没有任何东西告诉我。也许在 Twilio 的网站上有一种方法可以看到这一点,但我怀疑它是否不能将它与数字相关联?虽然它确实通过了 account_sid。

message = @client.account.messages.create(
    from: from, # this was passing in a nil value
    to: to,
    body: body,
    statusCallback:  "http://fptracker.herokuapp.com/twilio/callback"
)

【讨论】:

以上是关于Rails Twilio App 在运行时在heroku 中发送文本时挂起,但在heroku 上的rail 控制台中工作(以及在所有环境中的本地)的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4:为啥在生产中没有加载字体?

移动应用程序 - Twilio 视频/呼叫不一致的推送通知

登录时在浏览器中显示不同。Rails

Rails - 调用模型的方法时在视图中获取对象的字段

从浏览器到 ios App 的 Twilio 调用

Heroku 需要 40 分钟来执行来自 Twilio 的发布请求