-1

大きなファイル (~ 2 GB) をアップロードしようとしています。サーバーが巨大なファイルでクラッシュするのを防ぐために、Express から bodyParser を削除しました。クラッシュ エラーも断続的であるため、エラーが発生した時期と原因を特定することさえできません。

コードは次のとおりです。

channel = req.params.channel
  models.channel.findOne name: channel, (err, show) ->
    if err then console.log err
    if show?
      form = formidable.IncomingForm()
      files = []
      fields = []
      form.uploadDir = __dirname + '/../public/videos/resources/'

      form.on 'field', (field, value) ->
        #console.log field + ' ' + value
        fields.push [field,value]

      form.on 'file', (field, file) ->
        #console.log file
        files.push [field, file]

      form.on 'end', ->
        for file in files
          filename = file[1].name.replace /(.*)\//, ''
          ext = file[1].name.replace /(.*)\./, ''
          filename = uuid("#{filename}" + Date.now()) + ".#{ext}"
          fs.renameSync file[1].path, form.uploadDir + filename
          v = new models.video
          v.channel_id = channel._id
          v.title = 'Episode'
          v.description = ''
          v.url = filename

          v.save (err,results) ->
            if err then console.log err
            res.send 200

      form.parse req
    else
      res.send 403

アップロードが機能する場合もあれば、次のように爆発する場合もあります。

Error: parser error, 0 of 65536 bytes parsed
    at IncomingForm.write (/Users/brendan/github/node_modules/formidable/lib/incoming_form.js:145:17)
    at IncomingMessage.<anonymous> (/Users/brendan/github/node_modules/formidable/lib/incoming_form.js:95:12)
    at IncomingMessage.emit (events.js:67:17)
    at HTTPParser.parserOnBody [as onBody] (http.js:105:21)
    at Socket.ondata (http.js:1506:22)
    at TCP.onread (net.js:374:27)

他の誰かがこの問題を経験したことがありますか、またはこれの原因を知っていますか?

4

1 に答える 1

0

同様のエラーが発生しました。問題は、ミドルウェアのデータベースへの非同期呼び出しが原因でした。要求データ イベントのハンドラーが設定される前に、非同期呼び出しが送信されました。これにより、手ごわいデータの欠落が発生しました。

おそらく関連するリンク:

https://github.com/felixge/node-formidable/issues/130

https://github.com/felixge/node-formidable/issues/34

編集

ミドルウェア

getCategories = (req, res, next) ->
  data.getCategories (err, results) ->
    res.locals.categories = results
    next()

クエリ

data.getCategories = (callback) ->
    pg.connect connString, (err, client) ->
        client.query "SELECT name, slug FROM categories", (err, result) ->
            callback err, result.rows
于 2012-07-13T08:07:36.607 に答える