2014-10-16 7 views
0

저는 nodeJS 및 expressJS와 협력하고 있습니다. 나는이 개 기능 주요 기능 유무 :자바 스크립트 콜백 함수가 작동하지 않습니다.

download(imgUrl, imgMD5, function(fileLength, fileSize) { 
    console.log(fileLength); 

    var qb = data.Img.query(); 
    qb.where('img_md5', '=', imgMD5).update({ 
     img_downloaded: 1 
    }).then(function() {}); 
}); 

및 외부 함수

module.exports = function() { 
    return function(uri, filename) { 
     request(uri, function(err, res, callback) { 
      fileLength = res.headers['content-length']; 
      var mkdirs = function(fold, callback) { 

       var pf = path.dirname(fold); 

       fs.exists(pf, function(exists) { 
        var create = function() { 

         fs.mkdir(fold, callback); 
        }; 
        if (exists) { 
         create(); 
        } else 
         mkdirs(pf, create); 
       }) 
      }; 
      var folder = ('./downloaded/' + yy + '/' + mm + '/' + dd + '/' + ho + '/'); 

      mkdirs(folder, function() { 
       var r = request(uri).pipe(fs.createWriteStream(folder + filename)); 
       r.on('close'); 
      }); 
      callback(fileLength); 
     }); 
    }; 
}; 

을하지만 실행할 때 오류가 해고 것 : 난 경우

TypeError: string is not a function

나도 몰라 콜백 권한을 사용하는가?

+2

어떤 라인을? –

+0

@MattBall : 36 행의 "콜백 (fileLength);" 타이! –

답변

2

귀하의 request() 콜백 매개 변수를 매우 적절하게 표시되지 않습니다 감사합니다. 콜백에 전달 된 세 번째 인수는 함수가 아닌 응답의 전체 버퍼링 된 (문자열) 본문입니다. 그래서 그것이 callback(fileLength);에 불평하는 이유입니다.

또한 버퍼링 된 응답 전체를 수신하는 콜백을 사용했기 때문에 URL을 다시 요청할 필요가 없습니다. 그래서 당신은이를 변경할 수 : 이것에

mkdirs(folder, function(){ 
    var r = request(uri).pipe(fs.createWriteStream(folder + filename)); 
    r.on('close'); 
}); 

:

mkdirs(folder, function() { 
    // `data` here is the third argument to the `request()` callback ... 
    fs.writeFile(folder + filename, data); 
}); 

를 추가 HTTP 요청을 저장합니다. 당신이 정말로 응답 데이터를 스트리밍 할 경우

또는, 당신은 할 수 : 코드의

request(uri).on('response', function(res) { 
    // ... 

    mkdirs(folder, function() { 
    res.pipe(fs.createWriteStream(folder + filename)); 
    }); 
}); 
+0

감사합니다. 정말로 투표를하고 싶지만 할 담당자가 부족합니다. –

+0

나는 그것을 고쳤다! fs.writeFile (folder + filename, data); 내 함수의 데이터가 request (uri) 으로 변경되어야하며 콜백 매개 변수가 return 함수()에 있어야합니다. –

관련 문제