Http请求配置url必须是一个字符串。收到:未定义

时间:2016-08-11 18:01:49

标签: javascript angularjs

我刚将我的上传功能从控制器(它应该工作的地方)移到了工厂,它突然停止工作。我一直收到这个错误,但我不知道/不知道问题出在哪里

angular.js:13550 Error: [$http:badreq] Http request configuration url must be a string.  Received: undefined
http://errors.angularjs.org/1.5.5/$http/badreq?p0=undefined
    at angular.js:68
    at $http (angular.js:11194)
    at uploadWithAngular (ng-file-upload.js:91)
    at sendHttp (ng-file-upload.js:144)
    at upload (ng-file-upload.js:330)
    at Scope.$scope.uploadDocument (locationsCtrl.js:131)
    at fn (eval at compile (angular.js:14432), <anonymous>:4:338)
    at expensiveCheckFn (angular.js:15485)
    at callback (angular.js:25018)
    at Scope.$eval (angular.js:17229)

这是我在控制器中的上传文件功能

$scope.uploadDocument = function(file) {
    if($scope.documentName.length > 4) {
        $scope.errorMsg = '';
        file.upload = Upload.upload( documentsFactory.uploadDocument(
            $scope.id_location,
            $scope.documentName,
            $scope.documentDescription,
            file,
            $scope.locationUniqueId
        ));
        file.upload.then(function (response) {
            $scope.documentName = $scope.documentDescription = $scope.userFile = '';
            documentsFactory.getDocuments($scope.id_location).then(function (data) {
                $scope.documents = data;
            });
            $timeout(function () {
                file.result = response.data;
            });
        }, function (response) {
            if (response.status > 0)
                $scope.errorMsg = response.status + ': ' + response.data;
        }, function (evt) {
            // Math.min is to fix IE which reports 200% sometimes
            file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
        });
    }else{
        $scope.errorMsg = 'Name should be at least 5 chars long';
    }
};

这是我的工厂

factory.uploadDocument = function(id_location, name, description, file, locationUniqueId){
        return $http({
            method: 'POST',
            url: $location.protocol() + '://' + $location.host() + '/rest/api/document/documents',
            headers: {'Content-Type': 'application/x-www-form-urlencoded'},
            data: {
                id_location: id_location,
                name: name,
                description: description,
                userFile: file,
                locationUniqueId: locationUniqueId
            }
        }).then(function successCallback(response){
            return response.data;
        },function errorCallback(response){
            console.log('Error uploading documents: ' + response);
        });
    };

更新: 如果我做了#34;上传请求&#34;这是一个有效的例子。在我的控制器中

 file.upload = Upload.upload({
    url: $location.protocol() + '://' + $location.host() + '/rest/api/document/documents/',
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    data: {
        id_location: $scope.id_location,
        name: $scope.documentName,
        description: $scope.documentDescription,
        userFile: file,
        locationUniqueId: $scope.locationUniqueId
    }
});

如果您需要任何额外的炎症,请告诉我,我会提供。提前谢谢

1 个答案:

答案 0 :(得分:1)

在错误堆栈之后:

来自ng-file-upload repository.

this.upload = function (config, internal) {
你在那里打电话

 Upload.upload( documentsFactory.uploadDocument(
        $scope.id_location,
        $scope.documentName,
        $scope.documentDescription,
        file,
        $scope.locationUniqueId
    ));

第330行

return sendHttp(config);

第144行

uploadWithAngular();

第91行

$http(config).then(function (r) {

抛出错误的地方。看起来像Upload.upload不接受承诺,但是接受$ http调用的配置。

修改

返回配置对象怎么样?

factory.uploadDocument = function(id_location, name, description, file, locationUniqueId){
    return {
        method: 'POST',
        url: $location.protocol() + '://' + $location.host() + '/rest/api/document/documents',
        headers: {'Content-Type': 'application/x-www-form-urlencoded'},
        data: {
            id_location: id_location,
            name: name,
            description: description,
            userFile: file,
            locationUniqueId: locationUniqueId
        }
    }
};

最好的办法是将上传到工厂并返回承诺。

factory.uploadDocument = function(id_location, name, description, file, locationUniqueId){
    return Upload.upload({
        method: 'POST',
        url: $location.protocol() + '://' + $location.host() + '/rest/api/document/documents',
        headers: {'Content-Type': 'application/x-www-form-urlencoded'},
        data: {
            id_location: id_location,
            name: name,
            description: description,
            userFile: file,
            locationUniqueId: locationUniqueId
        }
    });