2016-03-04 17 views
7

fetch APIを使用してnode.jsサーバーにファイルをアップロードしようとしています(これは何か関係がある場合はgithubのpollyfillを使用しています):https://github.com/github/fetchファイルをアップロードする際にAPIとmulterエラーを取得します。

要求は次のように行われます。サーバー側で

const data = new FormData(); 
data.append('file', file); 
return fetch(this.concatToUrl(url), { 
    method: 'post', 
    headers: Object.assign({}, this.getHeaders(), {'Content-Type': 'multipart/form-data'}), 
    body: data, 
}); 

を私が持っている、ルートのこの宣言:

app.post('/media', upload.single('file'), mediaRoutes.postMedia); 

そして、このようなファイルを取得しようとしている:

exports.postMedia = function(req, res) { 
    console.log('req.file', req.file, req.files, req.body); 
    return res.sendStatus(200); 
} 

しかし、req.fileは入力されていません。

はまた、私は特急側からこのエラーを取得しています:

Error: Multipart: Boundary not found 
[2]  at new Multipart (/Users/jmanzano/Development/web/test/node_modules/busboy/lib/types/multipart.js:58:11) 
[2]  at Multipart (/Users/jmanzano/Development/web/test/node_modules/busboy/lib/types/multipart.js:26:12) 
[2]  at Busboy.parseHeaders (/Users/jmanzano/Development/web/test/node_modules/busboy/lib/main.js:64:22) 
[2]  at new Busboy (/Users/jmanzano/Development/web/test/node_modules/busboy/lib/main.js:21:10) 
[2]  at multerMiddleware (/Users/jmanzano/Development/web/test/node_modules/multer/lib/make-middleware.js:32:16) 
[2]  at Layer.handle [as handle_request] (/Users/jmanzano/Development/web/test/node_modules/express/lib/router/layer.js:95:5) 
[2]  at next (/Users/jmanzano/Development/web/test/node_modules/express/lib/router/route.js:131:13) 
[2]  at Route.dispatch (/Users/jmanzano/Development/web/test/node_modules/express/lib/router/route.js:112:3) 
[2]  at Layer.handle [as handle_request] (/Users/jmanzano/Development/web/test/node_modules/express/lib/router/layer.js:95:5) 
[2]  at /Users/jmanzano/Development/web/test/node_modules/express/lib/router/index.js:277:22 
[2]  at Function.process_params (/Users/jmanzano/Development/web/test/node_modules/express/lib/router/index.js:330:12) 
[2]  at next (/Users/jmanzano/Development/web/test/node_modules/express/lib/router/index.js:271:10) 
[2]  at cors (/Users/jmanzano/Development/web/test/node_modules/cors/lib/index.js:178:7) 
[2]  at /Users/jmanzano/Development/web/test/node_modules/cors/lib/index.js:228:17 
[2]  at originCallback (/Users/jmanzano/Development/web/test/node_modules/cors/lib/index.js:217:15) 
[2]  at /Users/jmanzano/Development/web/test/node_modules/cors/lib/index.js:222:13 
[2]  at optionsCallback (/Users/jmanzano/Development/web/test/node_modules/cors/lib/index.js:203:9) 
[2]  at /Users/jmanzano/Development/web/test/node_modules/cors/lib/index.js:208:7 
[2]  at Layer.handle [as handle_request] (/Users/jmanzano/Development/web/test/node_modules/express/lib/router/layer.js:95:5) 
[2]  at trim_prefix (/Users/jmanzano/Development/web/test/node_modules/express/lib/router/index.js:312:13) 
[2]  at /Users/jmanzano/Development/web/test/node_modules/express/lib/router/index.js:280:7 
[2]  at Function.process_params (/Users/jmanzano/Development/web/test/node_modules/express/lib/router/index.js:330:12) 

そして、これがミドルウェアを介したコンフィギュレーションです:

app.use(bodyParser.urlencoded({extended: true})); 
app.use(bodyParser.json()); 
app.use(expressValidator()); 
app.use(logger('dev')); 
app.use(cookieParser()); 
app.use(methodOverride()); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.set('JWTSuperSecret', jwtConfig.secret); 

if (process.env.NODE_ENV !== 'production') { 
    app.use(cors()); 
} 

はまた、これは正しくPOSTMANと協力しています。だから、私はリクエストに間違ったことをしていると思います。

ありがとうございます!

答えて

3

ヘッダーを割り当てる必要はありません。{Content-Type': 'multipart/form-data'}:ブラウザは独自のものを使用します。

しかし、あなたはそれを公開する場合、それはRequest PayloadRequest Headerscontent-type:multipart/form-data; boundary=...boundaryに指定されておらず、それは、サーバー側でエラーの原因となっています。

ブラウザコンソールを開いてヘッダーを確認すると、そのメッセージが表示されます。

ので、ちょうど:

fetch(this.concatToUrl(url), { 
    method: 'post', 
    body: data, 
}); 

それとも、あなたはカスタムヘッダーを必要とする場合は、このようにそれらを追加することができます。

var headers = Object.assign({}, 
          {'content-type': 'application/json'}, 
          this.getHeaders(), 
          {'Content-Type': 'multipart/form-data'} 
); 

    // Removal should be case insensitive, or in any case, the header will be included: 


Object.keys(headers) 
     .forEach(function(k) { 
     if (k.toLowerCase()==='content-type') delete headers[k] 
     }) 

const data = new FormData(); 
data.append('file', file); 
return fetch(this.concatToUrl(url), { 
    method: 'post', 
    headers: headers, 
    body: data, 
}); 
+0

このアプローチの問題は、(例えばJWT認証を許可するために)より多くのカスタムヘッダーを設定する必要があることです。それをどうすれば実現できますか? –

+1

ヘッダーのリストから 'content-type'プロパティを使用するだけです。更新を参照してください。 –

8

を郵便配達を使用しているときにエラーを持っているこのポスト時につまずく人のためにには、コンテンツタイプをヘッダーに指定しないでください。

+0

ああ、神様ありがとう –

関連する問題