【发布时间】: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