2

エラーが発生する可能性のあるunderステートメントがあります (たとえば、認証エラー)。under全体でコンテンツ ネゴシエーションを使用しており、内部のエラーを適切な形式で返したいと考えています。コード例:

under sub {
  my $self = shift;

  # Authenticated
  my $token = $self->param('token') || '';
  return 1 if $token eq '123456';

  # Not authenticated
  $self->respond_to(
    json => {
      json => { error => 'Invalid authentication token.' },
      status => 401
    },
    text => {
      text => 'Unauthorized.',
      status => 401
    }
  );
  return undef;
}

render内部underで使用できますが、機能しrespond_toません。おそらくunderそのために働いています。しかし、その場合、どうすればよいでしょうか?

4

1 に答える 1

1

ガリレオには、このようなことをするヘルパーauth_failがあります。例を考えながら、そのコード (および と ) を参照してif_authorくださいif_admin under

flashここに例があります。(少なくともこのメカニズムでは)失敗ハンドラーにリダイレクトする前に、次のハンドラーで使用できるようにする必要があるというトリックが判明しました。

#!/usr/bin/env perl

use Mojolicious::Lite;

any '/fail' => sub {
  my $self = shift;
  $self->respond_to(
    json => {
      json => { error => 'Invalid authentication token.' },
      status => 401
    },
    text => {
      text => 'Unauthorized.',
      status => 401
    }
  );
};

under sub {
  my $self = shift;

  # Authenticated
  my $token = $self->param('token') || '';
  return 1 if $token eq '123456';

  # Not authenticated
  $self->flash( format => $self->param('format') );
  $self->redirect_to('fail');
  return undef;
};

any '/private' => sub {
  my $self = shift;
  $self->respond_to(
    json => {
      json => { launch_codes => '9999999' },
    },
    text => {
      text => 'Launch Code: 9999999',
    }
  ); 
};

app->start;
于 2012-11-22T13:20:12.677 に答える