TDD(4) multer


投稿をアップロードする場合、フォームデータの画像ファイルをbody-parserに分けることはできませんのでmulterを使用する必要があります.s 3にアップロードされたbucketではなく、multer、multer-s 3、aws-sdkを使用してサーバ上の特定のフォルダ(ex.uploads)を生成し、格納することを実現しました.

Multier設定


まず、multerのstorageとlimitsは次のように設定されます.この場合、accessKeyやsecretAccessKeyなどは自分のAWSアカウントから액세스 키(액세스 키 ID 및 비밀 액세스 키)を取得する必要があり、aws-cliをインストールした後、awsconfigureはアクセスキーと秘密アクセスキーを格納する必要がある.
//config/multer.js
const multer = require("multer");
const multerS3 = require("multer-s3");
const aws = require("aws-sdk");
require("dotenv").config();

const s3 = new aws.S3({
  accessKeyId: process.env.S3_ACCESSKEYID,
  secretAccessKey: process.env.S3_SECRETKEY,
  region: process.env.S3_REGION,
});

const upload = multer({
  storage: multerS3({
    s3: s3,
    bucket:
      process.env.NODE_ENV !== "test"
        ? process.env.S3_BUCKETNAME
        : process.env.S3_TESTBUCKETNAME,
    acl: "public-read",
    key: function (req, file, cb) {
      cb(
        null,
        Math.floor(Math.random() * 1000).toString() +
          Date.now() +
          "." +
          file.originalname.split(".").pop()
      );
    },
  }),
  limits: {
    fileSize: 5 * 1024 * 1024,
  },
});

module.exports = upload;
supertestに投稿apiをアップロードして要求を送信すると、multerパケットのストレージパスとbodyがctrされます.createPostのreqに伝わります.
//api/post/index.js
router.post("/", upload.single("image"), ctrl.createPost);

テストコード


attach


テストコードを作成する際、フォームデータとボディの転送を長い間うろうろしていました.この間、request(app).post("/users").send(전송할 데이터).end(done)のようにsendにデータを送信し、フォームデータを送信する際にattachを使用する.複数のファイルを転送する場合.attachをつなげて記入すればいいです.attachは、最初のパラメータを使用してinputのnameで設定された値を作成し、2番目のパラメータを使用してファイルのパスを作成します.
テスト画像ファイルを転送するためにtestImgフォルダを作成し、任意の画像ファイルを追加し、2番目のパラメータを使用してファイルのパスを作成します.

field


ctrl.createPostでは、bucketの経路はreq.file.locationに、bodyはreq.body.contentに伝達される.ただし、テストコードを作成する場合、attachとsendを使用して2つのコードを同時に書き込むことができないエラーが発生します.そのため、このときデータは現場に転送される.

limits error handling


Multier設定でファイルサイズを設定し、ファイルサイズが超えた画像をアップロードするときにエラーハンドルミドルウェアを使用してエラーを処理できます.expressドキュメントによると、multerにエラーが発生した場合、multerはexpressを使用してエラーを渡します.従って、multer errorはif(err instance of multer.MulterError)で処理することができる.
私はインデックスjsで記述されたエラー処理ミドルウェアでは、if(err.name === 'MulterError')として処理される.