【问题标题】:Unable to send SMS through Twilio and Google Functions无法通过 Twilio 和 Google Functions 发送 SMS
【发布时间】:2018-08-08 11:39:43
【问题描述】:

我正在尝试使用 Twilio、firebase 和 Google Functions 以及 Postman 发送文本(一次性密码)。

我已经在函数目录中运行了 $ npm install --save twilio@3.0.0 -rc.13。

当我运行 $ firebase deploy 时,它完成了。但是在 Postman 上,当我执行 POST、Body 并提供 JSON { "phone": "555-5555" } 时,我收到“错误:无法处理请求。”

我可以将 Twilio 可编程 SMS 中的文本从我的 Twilio 号码发送到实际的外部号码,直接发送到手机。我正在为 Sid 和 AuthToken 使用实时凭据。

这是 Twilio、Google Functions 和某些配置的问题吗?

这里是函数的日志:

// 白旗标志// 函数执行耗时 1452 毫秒,状态为:'crash'

//红色警告标志// TypeError:处理程序不是函数 在 cloudFunction (/user_code/node_modules/firebase-functions/lib/providers/https.js:26:41) 在 /var/tmp/worker/worker.js:676:7 在 /var/tmp/worker/worker.js:660:9 在 _combinedTickCallback (内部/进程/next_tick.js:73:7) 在 process._tickDomainCallback (internal/process/next_tick.js:128:9)

此外,google eslint 强制一致返回,这就是我输入“return;”的原因。在 request-one-time-password.js 中。我似乎无法通过在 eslintrc 中添加 "consistent-return": 0 来关闭它。

我的密码(密匙和电话号码已编辑):

//one-time-password/functions/service_account.js
has my keys copied and pasted.

//one-time-password/functions/twilio.js


const twilio = require('twilio');

const accountSid = 'redacted';
const authToken = 'redacted';

module.exports = new twilio.Twilio(accountSid, authToken);

//one-time-password/functions/request-one-time-password.js

const admin = require('firebase-admin');
const twilio = require('./twilio');

module.export = function(req, res) {
  if(!req.body.phone) {
    return res.status(422).send({ error: 'You must provide a phone number!'});
  }
  const phone = String(req.body.phone).replace(/[^\d]/g, '');

  admin.auth().getUser(phone).then(userRecord => {
      const code = Math.floor((Math.random() * 8999 + 1000));
    // generate number between 1000 and 9999; drop off decimals
    twilio.messages.create({
      body: 'Your code is ' + code,
      to: phone,
      from: '+redacted'
    }, (err) => {
      if (err) { return res.status(422).send(err); }

      admin.database().ref('users/' + phone).update({ code: code, codeValid: true }, () => {
        res.send({ success: true });
      })
  });
return;
  }).catch((err) => {
    res.status(422).send({ error: err })
  });
}

/////////////////////////////////
//one-time-password/functions/index.js

const admin = require('firebase-admin');
const functions = require('firebase-functions');
const createUser = require('./create_user');
const serviceAccount = require('./service_account.json')
const requestOneTimePassword = require('./request_one_time_password');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://one-time-password-650d2.firebaseio.com"
});

exports.createUser = functions.https.onRequest(createUser);

exports.requestOneTimePassword = 
functions.https.onRequest(requestOneTimePassword);

【问题讨论】:

  • 您的 Firebase 项目是否使用 Spark(免费层)计划?如果是这样,这可能解释了您看到错误的原因,因为在免费套餐中,出站网络请求仅限于 Google 服务。检查firebase.google.com/pricing 并将鼠标悬停在 Cloud Functions 旁边的问号上
  • 我在火焰层。
  • 当您尝试访问该 http 函数时,您能否显示您的 Firebase 控制台中的日志内容?
  • 当然,我刚刚在第五段之后使用 Firebase 日志更新了上述内容。谢谢。
  • 终于成功了。问题是我必须获得一个新的服务帐户密钥,可能是在升级到 Blaze 层之后。我希望谷歌说升级后的关键变化,它会节省我几个小时。谢谢李约瑟先生的关注。

标签: firebase google-cloud-functions twilio-api


【解决方案1】:

让我困扰很久的一件事是 twilio 如何将请求正文发送到云函数。它将它发送到一个 body 对象中,以便访问您的请求正文,它看起来像这样

req.body.body

除此之外,它作为 JSON 字符串传递,所以我必须 JSON.parse()

我开始工作的例子:

export const functionName= functions.https.onRequest((req, res) => {
    cors(req, res, () => {   
            let body = JSON.parse(req.body.body);
            console.log(body);
            console.log(body.service_id);
            res.send();
    });
});

这也可能取决于您使用的 Twilio 服务。我正在使用他们的 Studio HTTP 请求模块。

希望这会有所帮助,但不确定这是否是您的确切问题:(

【讨论】:

    【解决方案2】:

    你有

    module.exports = new twilio.Twilio(accountSid, authToken);

    在一条线上,再往下

    module.export = function(req, res) { ... }.

    尝试将export 更改为exports

    【讨论】:

    • 感谢您的收获。我现在已经通过了“无法处理请求错误”并收到一条消息,上面写着“auth/user-not-found...没有与提供的标识符相对应的用户记录。”该代码应该只接受用户并在firebase数据库中创建一条记录,但它没有。此外,文本也没有发送......“
    猜你喜欢
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多