multerをマイナーからメジャーバージョンにアップデートするのに知りたい変更点
最近仕事でnodejsのバージョンを上げるためにミドルウェアのバージョンアップの調査をしています。
その際マイナーバージョンのmulterを今までのコードのままメジャーバージョンにアップデートしたら動かなくなってすこし悩みました。
よく考えれば簡単なことだったのですが解決策をここに残しておこうと思います。
現在の環境はこんな感じです
> node -v v0.10.32 > npm ls --depth=0 | grep multer ├── multer@0.1.7
これをnodeはLTSに、multerは最新にする作業をします。
まずは例のごとくnodeと依存パッケージのアップデート
> nodebrew use v4.4.7 > npm install multer@1.1.0
そして起動………すると
var express = require('express'); var app = express(); var multer = requier('multer'); app.use(mutler()); ^ ここでエラー | TypeError: app.use() requires middleware functions
もう単純には使わせてくれないみたいです。 express/multer ←ここのドキュメント読んでみるとそもそもメジャーアプデで大きく変更点がありました。
multer@0.1.7時に使っていたコードとmasterのコードを照らしあわせてみてみると、multer()
でのmiddewareの提供は廃止され、代わりにMulterオブジェクトが生成されて、そこから.single
.array
.fields
を使ってmiddlewareの使用をしていくようになりました。
なので今までのコードをこの形式にそって書き直すと
var multer = require('multer'); var os = require('os'); // ... express周りのいろいろ // app.use(multer()); もう使用にそぐわないので消す // ... var upload = multer({dest: os.tmpdir()}); // <-- 0.1.7でのdestのデフォルト値 app.post('/api/upload', upload.fields([ { name: 'file', maxCount: 1 } ]), (res, req) => { // fieldsに定義したものが返却される // arrayで返却される console.log(req.files.file[0]); res.send(true); });
このように書き直せます。変更の要点をまとめると
multer(opts)
ではmiddewareを返さない- マイナーバージョンでのopts.destのデフォルト値は
os.tmpdir()
に返却されるパス(opts指定しないとmemoryStorageを使う挙動) - 複数fieldを使う場合に変更点として
req.files.fieldname
はarrayになるので注意
上記3つを押さえていればなんなくmulterのバージョンアップはできると思います。(ただこの方法の場合使用箇所が多いほど地獄)
長いサービスを持っているとnodeのバージョンをミドルウェアに引きずられて上げられないのすごく辛いので地道に頑張ってアップデートいきましょう。(ヽ´ω`)