0

私はこのコードを持っています:

router.route("/post")
        .get(function(req, res) {
            ...
        })
        .post(authReq, function(req, res) {
            ...
            // Get uploaded file
            var fstream
            req.pipe(req.busboy)
            req.busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
            ...

            var fileSuffix = mimetype.split("/")[1] // Get suffix, may not always be correct
            var tmpFileName = postCount + "." + fileSuffix
            var tmpFileURL = __dirname + "/tmp/" + tmpFileName
            // Start writing
            fstream = fs.createWriteStream(tmpFileURL)
            file.pipe(fstream)
            fstream.on('close', function() {
                 ...
            })
        })
    })
})

これは完璧に機能します。しかし、何が起こったのかよくわかりませんが、今日コンピューターを手に取ったところ、投稿しようとするたびにこのエラーが発生することがわかりました。

TypeError: Cannot call method 'on' of undefined
    at IncomingMessage.Readable.pipe (_stream_readable.js:494:8)
    at /Users/nathan/Library/Mobile Documents/com~apple~CloudDocs/Dev/LaughItUp/Code/Server/apiRoutes.js:139:8
    at Layer.handle [as handle_request] (/Users/nathan/Library/Mobile Documents/com~apple~CloudDocs/Dev/LaughItUp/Code/Server/node_modules/express/lib/router/layer.js:82:5)
    at next (/Users/nathan/Library/Mobile Documents/com~apple~CloudDocs/Dev/LaughItUp/Code/Server/node_modules/express/lib/router/route.js:100:13)
    at authReq (/Users/nathan/Library/Mobile Documents/com~apple~CloudDocs/Dev/LaughItUp/Code/Server/apiRoutes.js:17:3)
    at Layer.handle [as handle_request] (/Users/nathan/Library/Mobile Documents/com~apple~CloudDocs/Dev/LaughItUp/Code/Server/node_modules/express/lib/router/layer.js:82:5)
    at next (/Users/nathan/Library/Mobile Documents/com~apple~CloudDocs/Dev/LaughItUp/Code/Server/node_modules/express/lib/router/route.js:100:13)
    at next (/Users/nathan/Library/Mobile Documents/com~apple~CloudDocs/Dev/LaughItUp/Code/Server/node_modules/express/lib/router/route.js:94:14)
    at Route.dispatch (/Users/nathan/Library/Mobile Documents/com~apple~CloudDocs/Dev/LaughItUp/Code/Server/node_modules/express/lib/router/route.js:81:3)
    at Layer.handle [as handle_request] (/Users/nathan/Library/Mobile Documents/com~apple~CloudDocs/Dev/LaughItUp/Code/Server/node_modules/express/lib/router/layer.js:82:5)

_stream_readable.js:501
    dest.end();
         ^
TypeError: Cannot call method 'end' of undefined
    at IncomingMessage.onend (_stream_readable.js:501:10)
    at IncomingMessage.g (events.js:180:16)
    at IncomingMessage.emit (events.js:92:17)
    at _stream_readable.js:943:16
    at process._tickCallback (node.js:419:13)

私のindex.jsファイルには、Busboy を使用するための次のコードがあります。

app.use(busboy())

次に、私のルートを含めるこのコード:

app.use("/api", require("./apiRoutes.js")())

前もって感謝します!

編集:私はもう少しデバッグを行っていましたが、問題を特定したと思います。req.busboy定義されていません。そこで、ソースコードを掘り下げました。connect-busboyモジュール内のコードの一部を次に示します。

if (req.busboy
|| req.method === 'GET'
|| req.method === 'HEAD'
|| !hasBody(req)
|| !RE_MIME.test(mime(req)))
return next()

実際の値を出力すると、busboy は存在しません。リクエスト メソッドは「POST」で、hasBody(req)結果は true ですが、RE_MIME.test(mime(req)))結果は false です。これが、busboy がリクエストに追加されない理由です。

サンプル ファイルの MIME タイプはimage/gif. 以下は、 (別名変数)をconnect-busboyテストする正規表現です。image/gifRE_MIME

/^(?:multipart\/.+)|(?:application\/x-www-form-urlencoded)$/i;

したがって、API を誤解しているという結論に達しました。Busboy は HTML フォーム専用ですか?

編集 #2: Multerに切り替えただけで、問題なく動作します。ただし、私の問題は、ファイルをリクエストのマルチパート部分に配置する必要があったことだと思います。なぜそれが以前に機能していたのかわかりません。ありがとう!

4

2 に答える 2

4

問題は、あなたのリクエストが ではなくmultipart/form-dataimage/gif代わりに. Busboy、multer、formidable、multiparty などは、multipart/form-data(ファイルをアップロードしている場合)そうでない限り、リクエストを解析できません。

于 2014-11-27T11:23:53.803 に答える