我对此很陌生。任何帮助都会有所帮助!!!!!!
基本上,它是一个系统,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?我可能不得不重新编写整个系统,尽管最好让这项工作 - 虽然我可以看到可能有更好的方法。
答案 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中的观察者等待上传曲目以发送下一曲目。这有效。不能说我在理智上知道它会永远有效,但是现在它每次运行它都能正常运作。