无法通过 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 请求模块。
希望这对您有所帮助,但不确定这是否是您的确切问题:(
我正在尝试使用 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 请求模块。
希望这对您有所帮助,但不确定这是否是您的确切问题:(