私はこのコードを持っています:
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/gif
RE_MIME
/^(?:multipart\/.+)|(?:application\/x-www-form-urlencoded)$/i;
したがって、API を誤解しているという結論に達しました。Busboy は HTML フォーム専用ですか?
編集 #2: Multerに切り替えただけで、問題なく動作します。ただし、私の問題は、ファイルをリクエストのマルチパート部分に配置する必要があったことだと思います。なぜそれが以前に機能していたのかわかりません。ありがとう!