2017-02-20 4 views
-1

MEAN 스택의 서버에 기능을 추가하고 싶습니다. 1) 브라우저에 localhost:3000/#/files을 입력하면 임시 텍스트 파일이 만들어져 열려있을 수 있습니다 by localhost:3000/#/{FILE_ID}.txt; 2) 브라우저를 닫으면 임시 파일이 삭제됩니다. 이를 위해 임시 파일을 올바른 위치에 생성하고 세션이 끝난 후 삭제하십시오.

, 나는 node-tmp를 사용하려고, 일부 코드를 작성했습니다 : A와

router.post('/createFiles', function (req, res, next) { 
    var tmp = require('tmp'); 
    var fs = require('fs'); 
    tmp.file({ prefix: 'projectA-', postfix: '.txt' }, function (err, path, fd) { 
     if (err) throw err; 
     console.log("File: ", path); 
     console.log("Filedescriptor: ", fd); 
     fs.writeFileSync(path, "Hello world!") 
    }); 
}); 

: 백 엔드에서

app.config(['$stateProvider', function ($stateProvider) { 
    $stateProvider 
     .state('files', { 
      url: '/files', 
      template: "Hello World", 
      controller: 'FilesCtrl' 
     }) 
}]); 

app.controller('FilesCtrl', ['$http', function ($http) { 
    $http.post('/createFiles', null, null); 
}]) 

: 프런트 엔드에서

을 결과적으로 브라우저에 localhost:3000/#/files을 입력하면 파일 /var/folders/fn/0rmvqqbs4k76lg5g6b7kll100000gn/T/projectA-40926BSynm5PKdMmW.txt이 생성되지만 브라우저 탭을 닫으면이 파일이 삭제되지 않습니다.

올바른 라이브러리를 사용하고 있습니까? 그렇다면 누구나 1) tmp 파일을 localhost:3000/#/{FILE_ID}.txt; 2) 세션이 끝나면 체계적으로 삭제 하시겠습니까?

답변

0

그러나 브라우저 탭을 닫으면이 파일이 삭제되지 않습니다.

브라우저 창을 닫으면 일반적으로 브라우저 창이 닫혔다는 서버 쪽 알림이 표시되지 않습니다.

  1. 서버 측 세션을 세션 타임 아웃 :

    개발자는 해결 방법이 여러 가지가 있습니다. 시간 초과가있는 서버 측 세션 객체를 만들고 생성 된 모든 파일을 특정 세션과 연관시킵니다. 해당 세션을 소유 한 사람이 일정 기간 동안 사이트를 방문하지 않았기 때문에 세션 시간 초과가 만료되면 해당 세션에 저장되어있는 파일을 제거하십시오.

  2. 모니터 연결시 웹 소켓 연결. 웹 페이지가 아직 연결되어있을 때 서버에서 모니터링 할 수 있도록 클라이언트에서 서버로 webSocket 연결을 사용하십시오. 브라우저 페이지가 닫힐 때 webSocket 연결이 끊어 지므로 서버의 해당 이벤트를 사용하여 해당 세션과 관련된 파일 지우기를 트리거 할 수 있습니다. 사이트 내의 한 페이지에서 다른 페이지로 이동하는 것만으로도 webSocket을 닫았다가 다시 열 수 있으므로 여기서도 시간 제한을 사용해야합니다. webSocket이 사용자에 의해 닫히고 얼마 후에 다시 열리지 않으면 사용자가 해당 브라우저 창을 닫았거나 다른 사이트로 이동했다고 가정 할 수 있습니다.

  3. 시간별 정리 프로세스. 임시 파일을 생성 한 날짜/시간을 기준으로 오래 지속되는 반복 정리 프로세스를 사용합니다. 여기서 X 시간 전에 생성 된 임시 파일을 확인하고 제거하는 매시마다 setInterval()에서 일부 기능을 실행할 수 있습니다.

은 tmp 파일이 로컬 호스트에 배치 될 수 있도록 : 3000/#/{FILE_ID은} 그것은 당신이 원하는 정확히 불분명

을 .txt로. http://localhost:3000/#/ {FILE_ID}txt는 파일 시스템의 위치가 아닙니다. 서버에 직접 전달되지 않는 해시 위치를 사용하는 URL입니다. 해당 URL을 사용하려면 {FILE_ID}.txt을 구문 분석 한 다음 (예 : Ajax 호출에 넣은) 클라이언트 코드가 있어야합니다.

Express를 사용하면 이와 같은 방식으로 URL의 내용을보고 적절한 임시 파일을 제공하는 일종의 일반 익스프레스 요청 처리기를 사용할 수 있습니다. 파일 시스템에 임시 파일을 넣을 위치를 결정할 수 있습니다 (전적으로 사용자에게 달려 있음). 파일을 배치하는 코드와 요청에서 제공하는 코드가 동일한 위치를 사용하는지 확인하면됩니다. 예를 들어

, 당신은 파일에 사용할 수있는 하나 개의 URL 방식이 같다 :

http://localhost:3000/file/{FILE_ID} 

그런 다음,이 같은 익스프레스 핸들러를 만들 수 :

app.get('/file/:fileID', function(req, res) { 
    let fileID = req.params.fileID; 
    res.sendFile(path.join(__dirname, "tempFiles", fileID), {dotfiles: "deny"}); 
}); 
+0

미안 해요, 내가 만들었다 고 생각 OP의 오류 :'localhost : 3000/#/{FILE_ID} .txt'가 그렇게 중요하지 않아야합니다. 이 파일들을 외부에서 열 수 있도록 "the_folder_of_my_site \ tmp_txt \"하위 폴더에 넣기 만하면됩니다. 어쨌든, 이것을 무시하십시오 ... – SoftTimur

+0

'node-tmp'가 올바른 라이브러리를 사용할 수 있습니까? 연결이 끊어진 후에도 파일 생성과 삭제를 관리 할 수있는 기존 라이브러리가 없습니까? – SoftTimur

+0

@SoftTimur - 문서'node-temp'를 보면서 알 수 있듯이, 고유 한 이름의 임시 파일을 생성하기위한 완벽한 기능을 제공하지만, 지정된 클라이언트가 더 이상 연결되지 않은 경우 정리할 수있는 기능이 없습니다. 정리 메소드는 node.js 프로세스가 종료 될 때와 관련이있는 것처럼 보입니다. 주어진 클라이언트가 연결을 끊을 때 클린업을 추가하는 방법에 대한 아이디어를 보려면 내 대답을 참조하십시오. – jfriend00