banseivlog

大器晩成型 - 仕事中の覚え書きや反省文を書く程度のブログです

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のバージョンをミドルウェアに引きずられて上げられないのすごく辛いので地道に頑張ってアップデートいきましょう。(ヽ´ω`)