絞り込み中のタグ : JavaScript

[AdonisJs] Amazon S3に保存したファイルをバイナリのまま返す方法

Adonis DriveのS3の実装の問題

AdonisJSはデフォルトでAmazon S3をサポートしていてそれはとても素晴らしい。 ただ以下のように取得しようとするとバイナリが壊れて困っていた。

const file = await Drive.disk('s3').get('mofu.jpg')

どうも実装を見ると取得したバイナリを何故かBuffer.string()を呼び出して返してる。どうして。

生のバイナリが欲しい場合はgetObject()を使うようにしないといけない。

const obj = await Drive.disk('s3').getObject('mofu.jpg')
const file = obj.Body

同じDriveでローカルストレージから取得する場合はDrive.get()でバイナリそのまま取れるのに……。実装をあわせて欲しい。


[JavaScript] 表示数が固定のページネーションを作る

概要

常に表示されるページ数が固定なページネーションを作成するスクリプトサンプルです。

太文字が現在ページ数として、以下のような感じで表示されます。

1 2 3 4 5

6 7 8 9 10

またページネーションのリンクとして ?page=1 みたいな文字列を付与するのですが、検索クエリ付きだと ?q=xxx?page=1 みたいに残念なことになるのでそうならないように工夫してあります。

(paginationのnodeモジュールはあったのですが、この問題があったために自作したという経緯があります。)

サンプルコード

サンプルコード(Gist)

使用例

const pagination = require('./pagination');

// 全ての引数が optional です。
const html = pagination({
  link: '/posts/', // 基本となるリンク
  query: { q: 'ちぇん' }, // 検索文字列など (?q=xxx とか) 
  current: 3, // 現在のページ数
  perPage: 10, // 1ページあたりの件数
  total: 55, // 総件数,
  viewPageNum: 5 // ページネーションの表示数
});

console.log(html);

[AdonisJs] 固定のエラーページを表示する

AdonisJsのエラーページ

AdonisJSの開発環境だとそれなりに活かしたエラーページが表示されるようになっています。

image

しかしこれが本番環境だと味気ないただの文字列が表示されるだけとなってしまう。

そのため、エラーページの表示は自分で作らないといけません。

作るのは比較的簡単でError Handlingを利用するだけである。

実装方法

まずは Handler.js をコマンドで生成します。

adonis make:ehandler

次に作成された Handler.js (App/Exceptions/Handler.js) を編集します。

'use strict'

const Env = use('Env')
const BaseExceptionHandler = use('BaseExceptionHandler')

class ExceptionHandler extends BaseExceptionHandler {
  async handle (error, context) {
    const { view, response } = context

    if (Env.get('NODE_ENV') === 'production') {
      // 本番環境の時だけ動作
      switch(error.status) {
        case 401:
          return response.status(error.status).send(view.render('error.401'))
        case 403:
          return response.status(error.status).send(view.render('error.403'))
        case 404:
          return response.status(error.status).send(view.render('error.404'))
        case 500:
          return response.status(error.status).send(view.render('error.500'))
      }
    }

    // これを忘れると開発環境で元のエラーページが表示されなくなるので注意
    return super.handle(error, context)
  }
}

module.exports = ExceptionHandler

そして最後に各種view (error.401 etc) を作ります。

これで本番環境で自分で作ったエラーページが表示されるようになります。

開発環境で確認する時は .env を一時的に編集するかなりしてください。