无法通过 Twilio 和 Google 函数发送短信

Unable to send SMS through Twilio and Google Functions

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

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

当我 运行 $ firebase 部署时,它完成了。但是在 Postman 上,当我执行 POST、Body 并输入 JSON { "phone": "555-5555" } 时,我得到一个 "Error: could not handle the request."

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

这是 Twilio、Google 函数和一些配置的问题吗?

以下是函数日志:

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

//红色警告标志// 类型错误:处理程序不是函数 在 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 (internal/process/next_tick.js:73:7) 在 process._tickDomainCallback (internal/process/next_tick.js:128:9)

此外,google eslint 强制一致-return,这就是为什么我将 "return;" 放在一次性请求中的原因-password.js。我似乎无法通过在 eslintrc 中添加 "consistent-return": 0 来关闭它。

我的代码(使用密钥和 phone 数字编辑):

//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);

你有

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

一条线上,再往下

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

尝试将 export 更改为 exports

有一件事让我困惑了很长时间,就是twilio如何将请求体发送到云函数。它在正文对象中发送它,以便访问您的请求正文,它看起来像这样

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 请求模块。

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