Twilio + Parse (Cloud Code) on back4app

539 views
Skip to first unread message

realtimez

unread,
Mar 18, 2016, 7:05:27 AM3/18/16
to back{4}app
Hi,

I'm trying to integrate Twilio + Parse on the back4app platform, from http://blog.parse.com/announcements/phone-based-login-can-you-dig-it/

However when I call the cloud code I'm getting 'Invalid Function' like few others been getting here.

Call from iOS:

 let params = ["phoneNumber" : textFieldText, "language" : preferredLanguage]

PFCloud.callFunctionInBackground("sendCode", withParameters: params) { response, error in


                self.editing = true

.....


Clouds Code:

require("cloud/app.js");

var twilioAccountSid = 'zzz';
var twilioAuthToken = 'zzz';
var twilioPhoneNumber = '111';
var secretPasswordToken = 'zzz';

var language = "en";
var languages = ["en", "es", "ja", "kr", "pt-BR"];

var twilio = require('twilio')(twilioAccountSid, twilioAuthToken);

Parse.Cloud.define("sendCode", function(req, res) {
var phoneNumber = req.params.phoneNumber;
phoneNumber = phoneNumber.replace(/\D/g, '');

var lang = req.params.language;
  if(lang !== undefined && languages.indexOf(lang) != -1) {
language = lang;
}

if (!phoneNumber || (phoneNumber.length != 10 && phoneNumber.length != 11)) return res.error('Invalid Parameters');
Parse.Cloud.useMasterKey();
var query = new Parse.Query(Parse.User);
query.equalTo('username', phoneNumber + "");
query.first().then(function(result) {
var min = 1000; var max = 9999;
var num = Math.floor(Math.random() * (max - min + 1)) + min;

if (result) {
result.setPassword(secretPasswordToken + num);
result.set("language", language);
result.save().then(function() {
return sendCodeSms(phoneNumber, num, language);
}).then(function() {
res.success({});
}, function(err) {
res.error(err);
});
} else {
var user = new Parse.User();
user.setUsername(phoneNumber);
user.setPassword(secretPasswordToken + num);
user.set("language", language);
user.setACL({});
user.save().then(function(a) {
return sendCodeSms(phoneNumber, num, language);
}).then(function() {
res.success({});
}, function(err) {
res.error(err);
});
}
}, function (err) {
res.error(err);
});
});

Parse.Cloud.define("logIn", function(req, res) {
Parse.Cloud.useMasterKey();

var phoneNumber = req.params.phoneNumber;
phoneNumber = phoneNumber.replace(/\D/g, '');

if (phoneNumber && req.params.codeEntry) {
Parse.User.logIn(phoneNumber, secretPasswordToken + req.params.codeEntry).then(function (user) {
res.success(user.getSessionToken());
}, function (err) {
res.error(err);
});
} else {
res.error('Invalid parameters.');
}
});

function sendCodeSms(phoneNumber, code, language) {
var prefix = "+1";
if(typeof language !== undefined && language == "ja") {
prefix = "+81";
} else if (typeof language !== undefined && language == "kr") {
prefix = "+82";
phoneNumber = phoneNumber.substring(1);
} else if (typeof language !== undefined && language == "pt-BR") {
prefix = "+55";
  }

var promise = new Parse.Promise();
twilio.sendSms({
to: prefix + phoneNumber.replace(/\D/g, ''),
from: twilioPhoneNumber.replace(/\D/g, ''),
body: 'Your login code for AnyPhone is ' + code
}, function(err, responseData) {
if (err) {
console.log(err);
promise.reject(err.message);
} else {
promise.resolve();
}
});
return promise;
}


The cloud code remains unchanged (except for auth keys) from https://github.com/parseplatform/anyphone.

I suspect the issue might be with require('twilio') or require("cloud/app.js");?

Any Ideas?

Thanks a lot!

Ricardo Seiji

unread,
Mar 18, 2016, 9:48:06 AM3/18/16
to back{4}app
Hello there.

Well, you are quite right in your supposition.
We're very sorry for not providing the complete documentation for migrating your Cloud Codes. We're working on that.

On the GitHub Wiki from Parse.com parse-server Project, the CCode topic says, and I quote:
"(...) You will need to replace any relative paths like ‘cloud/…’ to ‘./cloud’."

So, yes, you might change to require("../cloud/app.js"); or require("./app.js"); (Because everything relative to ./cloud).
But we'll look into your server status if something else went wrong. If so, please, send us a message.

Stay awesome, fellas.

realtimez

unread,
Mar 19, 2016, 4:30:47 AM3/19/16
to back{4}app
I have changed all the paths but still getting 'invalid function'.

I have pinpointed the issue (through commenting) to the following line:

app.use(express.bodyParser());


also fails when adding:

var twilio = require('twilio')(twilioAccountSid, twilioAuthToken);

Not a node.js developer but I'm guessing those npms are missing?

Thanks!

Davi Macêdo

unread,
Mar 21, 2016, 8:40:03 AM3/21/16
to back{4}app
The dependencies are installed, including twilio. The problem is the "app.use". app variable is not yet available (BUT will be). For moment, you can only handle POST requests using Parse.Cloud.define.

maspormen...@gmail.com

unread,
Apr 27, 2016, 12:34:02 PM4/27/16
to back{4}app
Any news about Twilio working with Cloud Code?

Davi Macêdo

unread,
Apr 29, 2016, 3:53:04 PM4/29/16
to back{4}app
Hi. Twilio is installed for all Parse Server apps running on back4app.

In order to use it, just do:
var twilio = require('twilio');

Then follow the instructions of the twilio docs:

Best.

aligerm...@gmail.com

unread,
Aug 9, 2016, 11:49:37 AM8/9/16
to back{4}app
Hello,

Are there any news regarding body-parser library?

Davi Macêdo

unread,
Aug 9, 2016, 11:51:40 AM8/9/16
to back{4}app
Hi. What do you exactly need to do? Best!

aligerm...@gmail.com

unread,
Aug 9, 2016, 11:57:26 AM8/9/16
to back{4}app
Hello,

Thank you for your quick response.

I am migrating similar code and experiencing issue regarding missing body-parser module. I have checked that it is not in your supported list. (http://docs.back4app.com/docs/faq-parse-back4app/which-cloud-modules-are-available-on-back4app/)

Could you suggest me an alternative for body-parser module?

Davi Macêdo

unread,
Sep 12, 2016, 11:26:32 PM9/12/16
to back{4}app
Hi,

Body parser is installed for all apps and parses all requests. You don't need even to require it. Can you please paste here your current code?

Best!

car...@canizal.com

unread,
Oct 7, 2016, 9:04:54 PM10/7/16
to back{4}app
Hi guys

I'm triying to use the bodyParser but I'm getting this error"

Most middleware (like bodyParser) is no longer bundled with Express and must be installed separately.

I already read that is installed and available but I can't make it work. Thanks.

This is my code

var express = require('express');
var app = express();  
app.use(express.bodyParser());


Davi Macêdo

unread,
Oct 9, 2016, 9:40:45 PM10/9/16
to back{4}app
Hi, Carlos.

You are trying to use bodyparse in order to integrate to Twilio?

You can use this approach here instead:

If you need to use body parser to another reason through web hosting, please send me your app id to ad...@back4app.com. I will enable hosting for your app.

Best!
Reply all
Reply to author
Forward
0 new messages