0
votes

We are using the same restful web service code from serviceutility.js for both android and ios. But the service is getting hit and values are retrieved only in ios. The same code is not working in android and we are getting the following error:

[ERROR] : TiExceptionHandler: (main) [2,821093] - In alloy/controllers/home.js:25,32

[ERROR] : TiExceptionHandler: (main) [0,821093] - Message: Uncaught TypeError: Cannot read property 'status' of null

[ERROR] : TiExceptionHandler: (main) [0,821093] - Source: if ("1" == response.status) alert(response.message); else if ("0"

[ERROR] : V8Exception: Exception occurred at alloy/controllers/home.js:25: Uncaught TypeError: Cannot read property 'status' of null.

Titanium SDK is 5.1.2 GA

exports.login = function(user, cb) {
var response = null;
if (Ti.Network.online) {
    var xhr = Ti.Network.createHTTPClient({
        timeout : 10000,
        validatesSecureCertificate : false
    });
    xhr.onload = function() {// Onload
        var responseTxt = this.responseText == '' ? '{}' : this.responseText;
        try {
            response = JSON.parse(responseTxt);
            cb(response, 'SUCCESS');
        } catch(e) {
            cb(response, 'ERROR');
        }
    };
    xhr.onerror = function(e) {
        if (xhr.status === 0) {
            cb(response, 'TIMEDOUT');
        } else {
            cb(response, 'ERROR');
        }
    };
    url = "https://";
    var postData = {
        employeeId : user.employeeId,
        password : user.password
    };
    xhr.open('POST', url);
    xhr.setTimeout(10000);
    xhr.setRequestHeader('employeeId', user.employeeId);
    xhr.setRequestHeader('password', user.password);
    xhr.send();} else {
            cb(response, 'NO_NETWORK');
}};

The below code is for index.js file where the actual retrieval of values happen.

if (Ti.Network.online) {
        loginUtil.login(user, function(response, status) {
            Ti.API.info("status----" + status);
            if (response.status == "0") {
                Ti.API.info("status== " + response.status);
                Ti.App.role = response.role;
                Alloy.createController('home',  {employeeId:$.userTextField.value,password:$.passwordTextField.value,from:"index"}).getView().open();
                
            } else if (response.status == '1') {

                alert(response.message);

            } else {

                alert("Please enter the correct credentials");
            }
        });
    }

Please help us on this.

3
you will need to show some code... what is in the success callback for your API call, as this is a regular javascript errorRene Pot
..or try Reste: github.com/jasonkneen/RESTeYozef
Hi Rene, Thanks for the reply. I have edited my question by adding coding part. Please refer to it.user3301420

3 Answers

1
votes

Looks like you are ONLY returning a string value instead of the entire response object. Then in your controller you attempt to access the .status property of the response object.

//this line returns the string responseTxt
response = JSON.parse(responseTxt);

Try returning the entire response object instead.

response = JSON.parse(this);

Then in your index.js controller use/ display the status property

alert(response.status);
0
votes

Your index.js expected response to be an object, but that is only the case where you call callback like this:

        response = JSON.parse(responseTxt);
        cb(response, 'SUCCESS');

All other places where you call callback the response variable is null, since that is what you initialise it with on the second line.

0
votes

Your callback returns two parameters, response & status, the second param is never used.

From reading the login function code, you only get to access the response object if status == "SUCCESS"

if(status === "SUCCESS"){
    if (response.status == "0") {
            Ti.API.info("status== " + response.status);
            Ti.App.role = response.role;
            Alloy.createController('home',  {employeeId:$.userTextField.value,password:$.passwordTextField.value,from:"index"}).getView().open();

    } else if (response.status == '1') {

            alert(response.message);

    } else {

            alert("Please enter the correct credentials");
    }
}
else {
    alert("whoops, please try again !"); // a more generic message.
}