Ошибка загрузки Meteor's CollectionFS: запись после окончания

Эта проблема появляется только на этапе производства, на этапе разработки - работает как шарм.

Когда пользователь пытается загрузить файл по ссылке, сгенерированной с помощью помощника:

<a href="{{fileRef.url download=true}}">Download</a>

На стороне сервера node.js терпит неудачу, и forever перезапускает его, повторяя эту ошибку:

Error: write after end
   at ServerResponse.OutgoingMessage.write (_http_outgoing.js:413:15)
   at ServerResponse.http.OutgoingMessage.write (packages/meteorhacks:inject-data/lib/server.js:56:1)
   at ServerResponse.res.write (/var/node/bundle/programs/server/npm/webapp/node_modules/connect/lib/middleware/compress.js:110:17)
   at ServerResponse.res.end (/var/node/bundle/programs/server/npm/webapp/node_modules/connect/lib/middleware/compress.js:116:14)
   at sendResponseIfDone (packages/cfs:http-methods/http.methods.server.api.js:543:1)
   at IncomingMessage.<anonymous> (packages/cfs:http-methods/http.methods.server.api.js:568:1)
   at IncomingMessage.emit (events.js:104:17)
   at _stream_readable.js:908:16
   at process._tickCallback (node.js:355:11)
error: Forever detected script exited with code: 1
error: Script restart attempt #1

На клиенте файл скачался только частично, наверное - только первый чанк. Пробовали менять кеширование обратного прокси nginx, настройки буферов, даже выключать - не помогает.

Любая идея, как исправить, или где искать ошибки? Любая помощь очень ценится.

Код инициализации коллекции:

path = (if (NODE_ENV is "development") then "/uploads/Addresses" else "/builded/bundle/programs/server/assets/app/uploads/Addresses")

Collections.Addresses = new FS.Collection 'Addresses', 
   stores: [ 
      new FS.Store.FileSystem 'Addresses' ,
        path: path
   ]
,
  filter: 
    allow: 
      extensions: ['xls', 'xlsx']

if Meteor.isServer
  Meteor.startup ->
    Collections.Addresses.allow
      insert: (userId) ->
        return checkFunc userId
      remove: (userId) ->
        return checkFunc userId
      update: (userId) ->
        return checkFunc userId
      download: (userId) ->
        return checkFunc userId

  Meteor.publish 'Addresses', (ProjectID) ->
    check ProjectID, Mongo.ObjectID

    if checkFunc this.userId
      Collections.Addresses.find 
        'metadata.project_id': ProjectID
    else
      throw new Meteor.Error 403, 'Permission denied'

person dr.dimitru    schedule 10.04.2015    source источник
comment
Не могли бы вы сообщить нам версию модулей, которые вы используете?   -  person Tristan Foureur    schedule 15.04.2015


Ответы (1)


@tristan-foureur Спасибо за ответ. Но мы застряли с этим пакетом, к тому же он значительно замедляет работу нашего приложения, не поддерживает нелатинские символы в имени файла и имеет ограничения на загрузку/выгрузку больших файлов.

Мы потратили две недели на исследования и создание собственного пакета: Meteor-Files. Он гладкий и простой в использовании. Ваши руки развязаны, вы можете делать что угодно с загруженными файлами, изменять, изменять размер изображений и даже сохранять их в GridFS, если хотите.

Мы надеемся, что наш пакет поможет решить такую ​​простую задачу, как загрузка/выгрузка файлов другим разработчикам. Метеориты объединяйтесь!

person dr.dimitru    schedule 16.04.2015
comment
Ох да! Я также создал свое собственное решение для выхода из CFS, но оно не очень хорошее. Я взгляну. - person Gaelan; 19.04.2015