REPL

REPL

Node.js REPLのように、AdonisJSはコマンドラインからアプリケーションと対話するためのアプリケーション対応のREPLを提供しています。node ace replコマンドを使用してREPLセッションを開始できます。

node ace repl

標準のNode.js REPLに加えて、AdonisJSは以下の機能を提供します。

  • TypeScriptファイルのインポートと実行
  • routerhelpershashサービスなどのコンテナサービスをインポートするための短縮メソッド
  • IoCコンテナを使用してクラスインスタンスを作成するための短縮メソッド
  • カスタムメソッドとREPLコマンドを追加するための拡張可能なAPI

REPLとの対話

REPLセッションを開始すると、有効なJavaScriptコードを入力してEnterキーを押すことで対話型のプロンプトが表示されます。コードの出力は次の行に表示されます。

複数行のコードを入力したい場合は、.editorコマンドを入力してエディターモードに入ることができます。複数行のステートメントを実行するにはCtrl+Dを押し、エディターモードをキャンセルして終了するにはCtrl+Cを押します。

> (js) .editor
# // エディターモードに入ります (終了するにはCtrl+D、キャンセルするにはCtrl+C)

最後に実行されたコマンドの結果にアクセスする

ステートメントの値を変数に割り当てるのを忘れた場合、_変数を使用してアクセスすることができます。例:

> (js) helpers.string.generateRandom(32)
# 'Z3y8QQ4HFpYSc39O2UiazwPeKYdydZ6M'
> (js) _
# 'Z3y8QQ4HFpYSc39O2UiazwPeKYdydZ6M'
> (js) _.length
# 32
> (js)

最後に実行されたコマンドで発生したエラーにアクセスする

前のコマンドで発生した例外には、_error変数を使用してアクセスできます。例:

> (js) helpers.string.generateRandom()
> (js) _error.message
# 'The value of "size" is out of range. It must be >= 0 && <= 2147483647. Received NaN'

履歴の検索

REPLの履歴はユーザーのホームディレクトリにある.adonisjs_v6_repl_historyファイルに保存されます。

履歴のコマンドをループ処理するには、上矢印キーを押すか、履歴内で検索するにはCtrl+Rを押します。

REPLセッションの終了

REPLセッションを終了するには.exitを入力するか、Ctrl+Cを2回押します。AdonisJSはREPLセッションを閉じる前に正常なシャットダウンを実行します。

また、コードベースを変更した場合は、新しい変更を反映するためにREPLセッションを終了して再起動する必要があります。

モジュールのインポート

Node.jsではREPLセッション内でimportステートメントを使用することはできません。そのため、動的なimport関数を使用して出力を変数に割り当てる必要があります。例:

const { default: User } = await import('#models/user')

importDefaultメソッドを使用して、デフォルトエクスポートに分割せずにアクセスすることもできます。

const User = await importDefault('#models/user')

ヘルパーメソッド

ヘルパーメソッドは特定のアクションを実行するためのショートカット関数です。.lsコマンドを使用して利用可能なメソッドのリストを表示できます。

> (js) .ls
# グローバルメソッド:
importDefault モジュールのデフォルトエクスポートを返します
make "container.make"メソッドを使用してクラスインスタンスを作成します
loadApp REPLコンテキストで"app"サービスをロードします
loadEncryption REPLコンテキストで"encryption"サービスをロードします
loadHash REPLコンテキストで"hash"サービスをロードします
loadRouter REPLコンテキストで"router"サービスをロードします
loadConfig REPLコンテキストで"config"サービスをロードします
loadTestUtils REPLコンテキストで"testUtils"サービスをロードします
loadHelpers REPLコンテキストで"helpers"モジュールをロードします
clear REPLコンテキストからプロパティをクリアします
p 関数をプロミス化します。Node.jsの"util.promisify"に似ています

REPLにカスタムメソッドを追加する

repl.addMethodを使用してREPLにカスタムメソッドを追加できます。メソッドは第1引数として名前、第2引数として実装のコールバックを受け取ります。

デモンストレーションのために、preloadファイルを作成し、./app/modelsディレクトリからすべてのモデルをインポートするメソッドを定義します。

node ace make:preload repl -e=repl
start/repl.ts
import app from '@adonisjs/core/services/app'
import repl from '@adonisjs/core/services/repl'
import { fsImportAll } from '@adonisjs/core/helpers'
repl.addMethod('loadModels', async () => {
const models = await fsImportAll(app.makePath('app/models'))
repl.server!.context.models = models
repl.notify('モデルをインポートしました。"models"プロパティを使用してアクセスできます')
repl.server!.displayPrompt()
})

repl.addMethodメソッドには、第3引数として以下のオプションを渡すこともできます。

  • description: ヘルプ出力に表示する人間が読める説明
  • usage: メソッドの使用方法のコードスニペットを定義します。設定しない場合は、メソッド名が使用されます。

完了したら、REPLセッションを再起動し、loadModelsメソッドを実行してすべてのモデルをインポートできます。

node ace repl
# 利用可能なコンテキストメソッド/プロパティのリストを表示するには".ls"を入力します
> (js) await loadModels()