0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

express middleware

Last updated at Posted at 2024-03-21

express middleware

body-parser

各ハンドラを実行する前に、request ボディを解析して、req.body プロパティで使えるようにする

  • 使い方
var app = require('express')();
var bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json({type: "application/*+json"}));
  • json parser

    • リクエストされたデータがjson形式にする。req.body で参照可能。
    • typeプロパティを指定することで、解析を実行する Content-type を指定できる。
  • raw parser

    • リクエストされたデータをBuffer形式にする。
  • text parser

    • リクエストされたデータを文字列にする。
  • urlencode parser

    • リクエストされたデータをurlencodeする。

express-session

セッション管理

express-flash

セッションにフラッシュメッセージを保存するミドルウェア

var cookieParser = require('express-parser');
var session = require('express-session');
var flash = require('express-flash'); # 設定(この設定をするとrequestにflash()メソッドが追加される)
var app = require('express');

app.use(cookieParser());
app.use(session({
  secret: "hogehoge",
  resave: true,
  saveUninitialized: true,
  cookie: {Maxage: 60000},
}));
app.use(flash());

# 使用
# 値付きでコールするとセッションに保存される
//index.ejs
<% if (messages.index) { %>
<%= messages.index %>
<% } %>

app.get("/", function(req, res, next){
    res.render("index");
});
app.get("/flash", function(req, res, next){
    req.flash("msg", "this is flash message!");
    res.redirect("/");
});

# キーのみでセッションの値を取得できる。
app.get("/getvalue", function(req, res, next){
    // flashメソッドをコールするとクッキーから削除される
    res.render("index", {"msg": req.flash("msg")});
});

cookie-parser

クッキーを処理するためのミドルウェア

# 設定(この設定をするとrequestにcookiesプロパティが追加される)
var cookieParser = require('cookie-parser');
var app = require('express');
app.use(cookieParser());
// app.use(cookieParser('signed')); // 署名付きクッキーを使う

# 使用
app.get("/", function(req, res, next){
    console.log('Cookies:' + req.cookies);
});

multer

ファイル(multipart/form-data)を処理するミドルウェア

  • 初期設定

    • dest: ファイルを保存するフォルダ(DiskStorageタイプになる)
    • storage: multer.diskStorage() or multer.MemoryStorage()
    • fileFilter: アップロードを許可するファイルの種類を指定する
    • limits: アップロードのサイズ制限
    • preservePath: ファイル名だけでなくフルパスを保持する
  • multerのメソッドは以下のメソッドを実行することで、middlewareになる。

    • single(fieldname): 1ファイルのみ。req.file に保存される
    • array(fieldname [, maxCount]): 配列指定の複数ファイル。req.files に保存される
    • fields(fields): フィールド名指定の複数ファイル。req.files に保存される
    • none : ファイルがアップロードされた場合、LIMIT_UNEXPECTED_FILE を出してエラーにする
    • any :
  • アップロードファイルオブジェクト(req.file | req.files)は以下のプロパティを持つ

    • fieldname: フォームで指定したフィールド名
    • originalname: ユーザ環境下のファイル名
    • encoding: ファイルのエンコードタイプ
    • mimetype: ファイルのMIMEタイプ
    • size: ファイルのバイトサイズ
    • destination: 保存されるフォルダ(DiskStorageタイプのとき)
    • filename: サーバ上のファイル名(DiskStorageタイプのとき)
    • path: サーバ上フルパス(DiskStorageタイプのとき)
    • buffer: 全ファイルのBuffer(MemoryStorageタイプのとき)
var express = require("express");
var app = express();
var multer = require("multer");

// 設定
var upload = multer({
     // dest と storageはどちらか指定
    dest: "./upload",
    // storage: multer.diskStorage() or multer.memoryStorage(),
    fileFilter: function(req, file, callback){
        // ここでファイルの確認処理をして

        callback(null, true);     // このファイルをアップロードする場合
        // callback(null, false); // このファイルをアップロードしない場合
    },
    limits: {
        fieldNameSize: 100, // フィールド名
        fieldSize: 1024000, // フィールド名の値(1MByte)
        fields: Infinity,   // ファイル以外のフィールド数
        fileSize: Infinity, // ファイルのサイズ(multipart forms)
        files: Infinity,    // fileフィールドの数(multipart forms)
        parts: Infinity,    // フィールドとファイルの数(multipart forms)
        headerPairs: 2000,  // ヘッダーのキーと値のペアの数(multipart forms)
    },
    preservePath: true,
});

// storageを指定する場合
var storageOpt = multer.diskStorage({
    // どこに保存するかを決定
    destination: function(req, file, callback) {
        callback(null, "/tmp/uploads");
    },
    // ファイル名をどうするか?
    filename: function(req, file, callback) {
        callback(null, file.fieldname + '-' + Date.now());
    }
});
var upload = multer({
    storage: storageOpt,
});

// single() /////////////////////////////////////////////////////////////////
app.get("/file", function(req, res, next){
    res.send("
    <form method="POST" action="/file" enctype="multipart/form-data">
        ファイルをアップロードしてください。
        <input type="file" name="filename">
        <input type="submit" value="upload">
    </form>
    ");
});

app.post("/file",
    upload.single("filename"), // filename: POSTしたファイルのnameプロパティ
    function(req, res, next) {
        console.log(req.file);
        fs.rename(req.file.destination + "/" 
            + req.file.filename, req.file.destination 
            + "/" + req.file.originalname, (err) => {
            if (err) return next(err);
            res.send("uploaded [{req.file.originalname}] as [{req.file.filename}] " 
              + "Size: [{req.file.size} Bytes]<br>"
              + "encoding is [{req.file.encoding}] and "
              + "[mimetpye is {req.file.mimetype}]<br><br>");
        });
    }
);

// array() /////////////////////////////////////////////////////////////
app.get("/file", function(req, res, next){
    res.send("
    <form method="POST" action="/file" enctype="multipart/form-data">
        ファイルをアップロードしてください。
        <input type="file" name="filename">
        <input type="submit" value="upload">
    </form>
    ");
});
app.post("/multifile", 
    upload.array("filenames[]"), // filename: POSTしたファイルのnameプロパティ
    function(req, res, next) {
        // req.files はアップロードファイルオブジェクトの配列になる
        console.log(req.files);
        var str = "";
        req.files.forEach(val => {
            str += formatFileObj(val);
            fs.rename(
                val.destination + "/" + val.filename, 
                val.destination + "/" + val.originalname, 
                (err) => {
                    if (err) return next(err);
                }
            );
        });
        res.send(str);
    }
);

// fields() /////////////////////////////////////////////////////////////
app.get("/file", function(req, res, next){
    res.send("
    <form method="POST" action="/fieldsfile" enctype="multipart/form-data">
        複数ファイルをアップロードしてください。<br>
        <input type="file" name="foo"><br>
        <input type="file" name="bar"><br>
        <input type="submit" value="upload">
    </form>
    ");
});
app.post("/fieldsfile", 
    upload.fields([
        {name: "foo", maxCount: 1}, // filename: POSTしたファイルのnameプロパティ
        {name: "bar", maxCount: 1},
    ]), 
    function(req, res, next) {
        // req.files はnameプロパティをキーとする辞書ファイルになる。値はアップロードファイルオブジェクト。
        console.log(req.files);
        var str = "";
        Object.keys(req.files).forEach(function(key){
            req.files[key].forEach(val => {
                str += formatFileObj(val);
                fs.rename(
                    val.destination + "/" + val.filename,
                    val.destination + "/" + val.originalname,
                    (err) => {
                        if (err) return next(err);
                    }
                );
            });
        });
        res.send(str);
    }
);

// エラー処理する場合 ///////////////////////////////////////////////////////////////
router.post("/file",
   function(req, res, next) {
        var singleupload = upload.single("filename");
        singleupload(req, res, function(err) {
            if (err) return next(err);

            console.log(req.file);
            console.log(req.body);
            fs.rename(req.file.destination + "/" + req.file.filename, req.file.destination + "/" + req.file.originalname, (err) => {
                if (err) return next(err);
                res.send(formatFileObj(req.file));
            });
        });
   }
);

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?