Javascript Uncaught TypeError:undefined不是Tianium中request()的函数

Javascript Uncaught TypeError:undefined不是Tianium中request()的函数,javascript,android,titanium,Javascript,Android,Titanium,我的一个函数有问题。 在app.js中,ia具有以下功能: //Including all functions Ti.include('functions.js'); //Including the login screen Ti.include('login.js'); //Including the register screen Ti.include('register.js'); 因此,所有函数都高于可以调用函数的其他文件 在login.js中,我有以下代码: //'login'

我的一个函数有问题。 在app.js中,ia具有以下功能:

//Including all functions
Ti.include('functions.js');

//Including the login screen
Ti.include('login.js');

//Including the register screen
Ti.include('register.js');
因此,所有函数都高于可以调用函数的其他文件

在login.js中,我有以下代码:

//'login' is the type
var request = request('login', loginUsernameInput.value, md5(loginPasswordInput.value));
        Ti.API.info('request: ' + request);
        if(request == true) {
            alert('You are loggedin');
        } else {
            alert('Something went wrong');
        }
请求函数如下所示:

function request(type, username, password) {
    //Database connection
    var db = Ti.Network.createHTTPClient();
    db.open('POST', 'http://myip/mobile_app/');

    Ti.API.info('type: ' + type);
    Ti.API.info('username: ' + username);
    Ti.API.info('password: ' + password);

    //If variables has been send
    db.onload = function() {
        var answer = this.responseText;
        Ti.API.info('type answer: ' + typeof this.responseText);
        if(answer == 'true') {
           Ti.API.info('TEST');
           return true;
        } else {
            return false;
        }
    };

    //Variables to send
    db.send({
        type: type,
        username: username,
        password: md5(password) 
    });

    //If there is an error
    db.onerror = function(e) {
        Ti.API.info('error: ' + JSON.stringify(e));
    };
}
我知道this.responseText返回true,
函数md5()
也可以工作。 我知道这一点,因为我还测试了login.js,代码如下:

Ti.API.info('request: ' + request('login', loginUsernameInput.value, md5(loginPasswordInput.value)));
        if(request('login', loginUsernameInput.value, md5(loginPasswordInput.value)) == true) {
            alert('You are loggedin');
        } else {
            alert('Something went wrong');
        }
上面还返回
函数请求()
未定义的

因此,一旦尝试登录,我就会出现以下错误:


因此,我的问题是如何解决错误?

我认为问题在于您将变量
request
重新定义为
函数request
的返回值。您请求的函数不返回任何内容。因此,它返回未定义的

现在,您将
请求设置为
未定义
。您不能再使用
request()
,因为您已经重写了它

尝试将未定义的值作为函数调用时,会导致未定义的值不是函数


请参见演示:

我认为问题在于您将变量
request
重新定义为
函数request
的返回值。您请求的函数不返回任何内容。因此,它返回未定义的

现在,您将
请求设置为
未定义
。您不能再使用
request()
,因为您已经重写了它

尝试将未定义的值作为函数调用时,会导致未定义的值不是函数


请参见演示:

我认为问题在于您将变量
request
重新定义为
函数request
的返回值。您请求的函数不返回任何内容。因此,它返回未定义的

现在,您将
请求设置为
未定义
。您不能再使用
request()
,因为您已经重写了它

尝试将未定义的值作为函数调用时,会导致未定义的值不是函数


请参见演示:

我认为问题在于您将变量
request
重新定义为
函数request
的返回值。您请求的函数不返回任何内容。因此,它返回未定义的

现在,您将
请求设置为
未定义
。您不能再使用
request()
,因为您已经重写了它

尝试将未定义的值作为函数调用时,会导致未定义的值不是函数


参见演示:

事实上,@Gabs00说您正在重新定义请求变量是正确的

但真正的问题是你如何避免这个问题

答案就在于你的编码方式。通过使用Ti.include,您没有使用钛推荐的最佳实践

相反,您应该这样做:

在文件models/User.js中:

exports.request = function(type, username, password) {
    // Your code here
};
然后,不要写(在你的app.js文件中):

您将有:

var User = require('models/User');
User.request('login', loginUsernameInput.value, md5(loginPasswordInput.value));
但即使有了这个代码,它也不够令人满意。。。 您可能应该尝试的是根据您的请求声明尽可能多的函数。即使现在你的代码对于你的2个请求来说是通用的,我可以向你保证不会太长

因此,我推荐最后一个代码:

在您的models/User.js文件中:

Ti.include('functions.js');
var request = request('login', loginUsernameInput.value, md5(loginPasswordInput.value));
function request(type, username, password) {
    // Your code
};
exports.login = function(username, password) {
    request('login', username, password);
};
exports.register = function(username, password) {
    request('register', username, password);
};
var User = require('models/User');
User.login(loginUsernameInput.value, md5(loginPasswordInput.value));
这段代码的酷之处在于,您的请求方法得到了完全保护:唯一可以访问此函数的代码是在models/User.js文件中编写的代码。对于其他人来说,这个函数甚至不存在

在你的app.js文件中:

Ti.include('functions.js');
var request = request('login', loginUsernameInput.value, md5(loginPasswordInput.value));
function request(type, username, password) {
    // Your code
};
exports.login = function(username, password) {
    request('login', username, password);
};
exports.register = function(username, password) {
    request('register', username, password);
};
var User = require('models/User');
User.login(loginUsernameInput.value, md5(loginPasswordInput.value));
我认为这样更容易阅读,不是吗

如果您想了解有关此模式的更多信息,您可能应该阅读以下文章:


正如您将看到的,您也应该在windows中重用此模式(您的Ti.include('login.js');Ti.include('register.js');

事实上,@Gabs00说您正在重新定义请求变量是正确的

但真正的问题是你如何避免这个问题

答案就在于你的编码方式。通过使用Ti.include,您没有使用钛推荐的最佳实践

相反,您应该这样做:

在文件models/User.js中:

exports.request = function(type, username, password) {
    // Your code here
};
然后,不要写(在你的app.js文件中):

您将有:

var User = require('models/User');
User.request('login', loginUsernameInput.value, md5(loginPasswordInput.value));
但即使有了这个代码,它也不够令人满意。。。 您可能应该尝试的是根据您的请求声明尽可能多的函数。即使现在你的代码对于你的2个请求来说是通用的,我可以向你保证不会太长

因此,我推荐最后一个代码:

在您的models/User.js文件中:

Ti.include('functions.js');
var request = request('login', loginUsernameInput.value, md5(loginPasswordInput.value));
function request(type, username, password) {
    // Your code
};
exports.login = function(username, password) {
    request('login', username, password);
};
exports.register = function(username, password) {
    request('register', username, password);
};
var User = require('models/User');
User.login(loginUsernameInput.value, md5(loginPasswordInput.value));
这段代码的酷之处在于,您的请求方法得到了完全保护:唯一可以访问此函数的代码是在models/User.js文件中编写的代码。对于其他人来说,这个函数甚至不存在

在你的app.js文件中:

Ti.include('functions.js');
var request = request('login', loginUsernameInput.value, md5(loginPasswordInput.value));
function request(type, username, password) {
    // Your code
};
exports.login = function(username, password) {
    request('login', username, password);
};
exports.register = function(username, password) {
    request('register', username, password);
};
var User = require('models/User');
User.login(loginUsernameInput.value, md5(loginPasswordInput.value));
我认为这样更容易阅读,不是吗

如果您想了解有关此模式的更多信息,您可能应该阅读以下文章:


正如您将看到的,您也应该在windows中重用此模式(您的Ti.include('login.js');Ti.include('register.js');

事实上,@Gabs00说您正在重新定义请求变量是正确的

但真正的问题是你如何避免这个问题

答案就在路上