对于不起作用的HTTP请求循环(Node.js,S3,javascript)

时间:2016-12-18 00:51:40

标签: angularjs node.js http amazon-s3

我对此很陌生。任何帮助都会有所帮助!!!!!!

基本上,它是一个系统,Angular运行一系列文件,然后向服务器发出上传请求。服务器采取的第一步是将文件添加到数据库,然后上传文件。

Angular正在正确发送文件[1,2,3,4]但是当SERVER将数据发布到数据库时,我发现它重复随机对象并跳过其他对象。

这让我很困惑。

这是我的代码:

角:

       for (var i = 0; i < files.length; i++) {
            console.log('angular uploading file!')
            console.log(files[i].trackNumber)
          Upload.upload({
            url: '/../api/createTrack', 
            data: {file: files[i].trackFile, trackUserName: scope.username, trackNumber: files[i].trackNumber, trackName: files[i].trackName, trackAlbum: scope.albumName, trackArtist: scope.artistEditName, trackArtistImage: scope.currentArtistData.artistImage, trackAlbumTrackLength: scope.tracks.length},
                file: files[i].trackFile
            })
        }.then(function (res) {
        console.log('Success ' + res.config.data.file.name + 'uploaded. Response: ' + res.data)
            }, function (res) {
        console.log('Error status: ' + res.status)
            }, function (evt) {
        var progressPercentage = parseInt(100.0 * evt.loaded / evt.total)
        console.log('progress: ' + progressPercentage + '% ' + evt.config.data.file.name)
            })

Node.js的:

createTrack.prototype.uploadFile = function(req, res) {

    var file = req.files.file;

    addWavFile = function(trackWavSource){
        read_file = fs.readFileSync(file.path)
        var params = {Bucket: 'dogatracks', Key: trackWavSource, Body: read_file, ACL:"public-read"}
        s3.putObject(params, function(err, data) {
            if (err) {
                console.log("Error uploading data: ", err)
            } else {
            etc

    addTrackToDatabase = function(artistId, albumId, trackAlbumArt, trackWavSource){
        const dateAdded = new Date()
        Track
        .create({
            trackName:req.body.trackName,
            trackNumber: req.body.trackNumber,
            trackAlbum: req.body.trackAlbum,
            ETC

现在,它工作,文件有时上传得很好,但有时由于某种原因文件在数据库中重复...这里是日志输出的例子:

addtodatabase:
1
add File:
1
addtodatabase:
1
add File:
1
addtodatabase:
3
add File:
3
addtodatabase:
4
add File:
4

正如您所看到的,系统通常可以正常工作,但由于某种原因,文件会随机重复!第一首曲目上传了两次,并两次添加到数据库中。这不会发生在第一首曲目上。此外,有时所有曲目上传都很好。在Angular日志中,文件始终以正确的顺序发送为1,2,3,4。我觉得我错过了有关服务器/ HTTP实际工作方式的一些信息。

这与时间有关吗?我不知道服务器会错过请求或重复请求的方式,因为Angular每次都会在循环内部发送正确的信息。

非常感谢任何帮助。

新线索:

每次请求服务器端代码时,代码都会为请求创建唯一的ID: 1a6e4ef9-48bf-4612-8562-8b38ab1b6725 在数据库内部,每个444轨道对象具有相同的ID!很明显,服务器并没有真正“解雇”#34;该轨道对象的功能。在函数内,无论出于何种原因,服务器一遍又一遍地输出对象。就像函数获取新请求时一样,它不会对新信息(或其他东西)进行操作,而是再次将当前信息激发给Mongoose?我可能不得不重新编写整个系统,尽管最好让这项工作 - 虽然我可以看到可能有更好的方法。

1 个答案:

答案 0 :(得分:0)

scope.uploadTracks = function (files) {
        console.log('angular track upload:')
        console.log(files)
      if (files && files.length) {
        var i = -1
            if (i < files.length){
                $timeout(function(){i+=1}, 100)
                scope.$watch(function(){return i},
                        function(){
                        console.log('angular uploading file!')
                        console.log(files[i].trackNumber)
                      Upload.upload({
                        url: '/../api/createTrack', 
                        data: {file: files[i].trackFile, trackUserName: scope.username, trackNumber: files[i].trackNumber, trackName: files[i].trackName, trackAlbum: scope.albumName, trackArtist: scope.artistEditName, trackArtistImage: scope.currentArtistData.artistImage, trackAlbumTrackLength: scope.tracks.length},
                            file: files[i].trackFile
                        }).then(function (res) {
                    console.log('Success ' + res.config.data.file.name + 'uploaded. Response: ' + res.data)
                    i+=1
                    //when this is successful, it should upload the next file.
                        }, function (res) {
                    console.log('Error status: ' + res.status)
                        }, function (evt) {
                    scope.uploadProgress = parseInt(100.0 * evt.loaded / evt.total)
                    console.log('progress: ' + scope.uploadProgress + '% ' + evt.config.data.file.name)
                        })
                        }
                    )
          }
        }
    }

我重写了这个功能。现在,它正在暂时工作。该功能利用Angular中的观察者等待上传曲目以发送下一曲目。这有效。不能说我在理智上知道它会永远有效,但是现在它每次运行它都能正常运作。