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 控制台中工作(以及在所有环境中的本地)的主要内容,如果未能解决你的问题,请参考以下文章