【问题标题】:For loop of HTTP requests not working (Node.js, S3, javascript)对于 HTTP 请求循环不起作用(Node.js、S3、javascript)
【发布时间】:2017-05-03 10:30:45
【问题描述】:

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

基本上,这是一个系统,其中 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!很明显,服务器并没有真正为该跟踪对象再次“触发”该函数。在函数中,无论出于何种原因,服务器都会一遍又一遍地输出对象。就像当函数收到新请求时,它不是对新信息(或其他东西)进行操作,而是再次将当前信息触发给 Mongoose?我可能只需要重新编写整个系统,尽管让这项工作更可取 - 尽管我可以看到可能有更好的方法。

【问题讨论】:

  • 您没有在角码中确认上传成功(或错误)。
  • 我刚刚添加了,我仍然遇到同样的问题,例如:
  • 我上传了曲目 1,2,3,4,5,结果如下:1,4,4,4,5
  • 在 Chrome 的控制台中得到了这个:
  • 成功 1.wav 上传。响应:... 成功 4.wavuploaded。 ...成功 5.wavuploaded。响应:...(2和3没有发布,但4被添加到数据库中3次)

标签: angularjs node.js http amazon-s3


【解决方案1】:
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 中的观察者来等待曲目上传以发送下一个曲目。这行得通。不能说我在理智上知道它会永远工作,但到目前为止,我每次运行它时它都能正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    相关资源
    最近更新 更多