ハマってしまったので覚書。
multerはscrfの前に書く必要があるよう。
公式のSimple express exampleコードを参考にしてrouterファイルを使う場合
app.js
const cookieParser = require('cookie-parser')
const csrf = require('csurf')
const bodyParser = require('body-parser')
const express = require('express')
// create express app
const app = express()
// parse cookies
// we need this because "cookie" is true in csrfProtection
app.use(cookieParser())
//router
app.use('/', index);
index.js
const express = require('express');
const multer = require('multer');
const router = express.Router();
const upload = multer({dest: 'uploads/', limits: {fileSize: 5000000}});
//router内側で宣言
const bodyParser = require('body-parser');
const csrf = require('csurf');
// setup route middlewares
const csrfProtection = csrf({ cookie: true });
const parseForm = bodyParser.urlencoded({ extended: false });
router.get('/form',csrfProtection,function(req,res){
// pass the csrfToken to the view
res.render('send', { csrfToken: req.csrfToken() })
}
//multerはscrfの前!
router.post('/process',upload.fields([{name: 'image'}]),parseForm,csrfProtection, function (req, res, next) {
res.send('data is being processed')
}
たったこれだけだが予想以上にハマってしまったので忘れないようにメモ。
app.js内でapp.use(csrf({ cookie: true })する方が楽で、その場合はその前にmulterを入れるのだろうが
app.use(multer())を使ったことが無いのでとりあえずこっちで。