2017-02-20 13 views
-1

Я хочу добавить функциональность на моем сервере стека MEAN: 1) ввод localhost:3000/#/files в браузере создаст временный текстовый файл, который можно открыть по localhost:3000/#/{FILE_ID}.txt; 2) закрытие браузера приведет к удалению временного файла.Создайте временные файлы в нужном месте и удалите их после окончания сеанса

Для этого я пытаюсь использовать node-tmp, и написал код:

В переднем конце:

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); 
}]) 

В фоновом:

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!") 
    }); 
}); 

Как результат, ввод 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, поэтому вам также придется использовать таймаут здесь. Если webSocket закрыт пользователем, а затем не открывается за короткий промежуток времени, вы можете предположить, что пользователь закрыл это окно браузера или перешел на какой-либо другой сайт.

  3. Ежечасный процесс очистки. Используйте какой-то повторяющийся процесс очистки, который отфильтрует временные файлы на основе даты/времени, когда они были созданы. Здесь вы можете просто запускать некоторую функцию на setInterval() каждый час, который проверяет временные файлы, которые были созданы больше, чем X часов назад и удаляет их.

пусть файл TMP быть размещен в локальном хосте: 3000/#/{file_id} .txt

Неясно именно то, что вы хотите здесь. http://localhost:3000/#/ {FILE_ID}.txt не является местом в вашей файловой системе. Это URL-адрес, который использует хеш-местоположение, которое даже не будет передано непосредственно на сервер. Чтобы использовать этот URL, вам нужно будет иметь код клиента, который проанализировал {FILE_ID}.txt, а затем что-то с ним (возможно, поместил бы его в вызов Ajax).

Использование Экспресса, способ, которым это работает, заключается в том, что у вас будет какой-то родовой экспресс-обработчик запросов, который будет смотреть на что-то в 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 - Насколько я могу судить, глядя на doc 'node-temp', вы получаете прекрасные возможности для создания уникальных временных файлов, но у него нет функций для их очистки, когда данный клиент больше не подключен. По-видимому, методы очистки связаны с тем, когда вы завершили процесс node.js. Вы можете обратиться к моему ответу за идеи о том, как добавить очистку, когда данный клиент отключается. – jfriend00