2014-04-08 2 views
3

GridFS에 프로젝트와 파일을 저장하려고합니다. 먼저 프로젝트를 저장하고 프로젝트의 "_id"를 메타 데이터로 사용하여 파일을 저장하려고합니다. 내가 ENOENT를 얻으려고했는데 '/ tmp/45e85388793de'오류가 발생했습니다. 여기 내 코드는ENOENT 오류, nodejs에서 '/ tmp/45e85388793de'열기

newProject.save(function (err,project) { 
      if (err) { 
       console.log('save error', err); 
      } 
      console.log("project added"); 
      var id=poject._id; 
      var filepath = req.files.file.path; 
      var filename = req.files.file.name; 
      var writestream = gfs.createWriteStream({ filename: filename, metadata:id }); 
      console.log(filepath);              
      fs.createReadStream(filepath) 
      .on('end', function() { 

      }) 
      .on('error', function(err) { 
      console.log("error encountered"+err);//ENOENT,open error 
      }) 
      .pipe(writestream); 
      }); 

이 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

답변

4

난 당신이 있기 때문에이 오류를 얻고있다 생각합니다. 콜백 함수 안에 있으면 파일이 해당 위치에서 제거되어 "No such file"오류가 발생합니다. 경로 및 기타 변수는 여전히 js의 일부로 존재하므로 콘솔에서 해당 변수를 인쇄 할 수 있습니다.

솔루션 : 위 (외부) 콜백 기능을 사용하여 다른 영구적 인 위치로 파일을 이동 : 해당 위치의

 fs.rename(req.files.file.path, "./someKnownPath/filename"); 

보관할 노트. 콜백 함수에서 새 위치를 경로로 사용하고 파일을 gridfs에 저장하십시오. 파일이 저장되면 해당 위치에서 파일을 삭제할 수 있습니다 (/ someKnownPath/filename).

5

여기서 ENOENT는 "해당 파일이나 디렉토리가 없음"을 의미합니다. createReadStream와 함께 읽으려는 filepath이 존재하지 않는다는 의미입니다. 귀하의 파일을 임시 위치에 저장됩니다

:

+0

안녕하세요, 나는 같은 문제에 직면하고 있습니다.이 오류는 디렉토리가 존재하지 않을 때 발생한다는 것을 알고 있습니다. 보시다시피 프로젝트에 파일을 연결해야하므로 프로젝트를 저장 한 후 파일을 쓰고 있습니다. 그래서 project.save()의 콜백 함수에 파일을 저장하는 코드를 작성했지만 거기에서 작동하지 않습니다. 동일한 코드를 .save 블록 외부에두면 동일한 코드가 동일한 경로에서 완벽하게 작동합니다. (나는 내외부의 경로를 보여 주었고 그들은 동일하다) –

1

이 오류는 나에게도 발생했습니다. 그 이유는 임시 디렉토리가 존재하지 않았기 때문입니다. 수동으로 생성하고 시도를 한 후에 작동했습니다.

이제 node.js를 통해 직접 디렉토리를 만들었습니다.