无法通过Twilio和Google功能发送短信

时间:2018-02-28 14:41:53

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

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

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

当我运行$ firebase部署时,它就完成了。但是在Postman上,当我做POST,Body并提供一个JSON {" phone":" 555-5555" },我得到一个"错误:无法处理请求。"

我可以将Twilio可编程短信中的文本从我的Twilio号码发送到直接连接到手机的实际外线号码。我使用Sid和AuthToken的实时凭证。

这是Twilio,Google Functions和一些配置的问题吗?

以下是功能日志

//白旗标志// 功能执行花了1452毫秒,完成状态:'崩溃'

//红色警告标志// TypeError:handler不是函数     在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     at _combinedTickCallback(internal / process / next_tick.js:73:7)     at process._tickDomainCallback(internal / process / next_tick.js:128:9)

此外,google eslint强制一致返回,这就是为什么我把" return;"在request-one-time-password.js中。我似乎无法通过在eslintrc中添加"一致 - 返回":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);

2 个答案:

答案 0 :(得分:0)

你有

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

在一行上,然后向下

export

尝试将exports更改为<div> <table class="table table-striped table-hover table-bordered" id="OutstandingInvoicesTable"> <thead> <tr> <th>ID</th> <th>Date</th> <th>Description</th> <th>Debit</th> <th>Credit</th> <th>Pay</th> </tr> </thead> <tbody> <tr> <td>377</td> <td>7/9/2013</td> <td title='Payment on account from system'>Payment on</td> <td class="pTransactionRight">$0.00</td> <td class="pTransactionRight">$231.56</td> <td> <label class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_PaymentChecked_377"/> <span class="custom-control-indicator"></span> </label> </td> </tr> </tbody> </table> </div>

答案 1 :(得分:0)

长时间绊倒我的一件事是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请求模块。

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