問題タブ [haskell-snap-framework]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - SnapWebフレームワークハンドラーのテスト
Snap Webハンドラーの統合テストを少し書きたいのですが、行き詰まります。これがシナリオです。私は、(ありふれたスタイルの)型をCRUDするSnap Webハンドラーを持っており、次のようになります。
モジュールにはリクエストの作成に役立つものがいくつかあり、Snap.Test
それを使用してハンドラーのリクエストを作成します。
ここに問題があります。このハンドラーのTestUnitTestCaseを作成したいので、createOwnerReq
リクエストでハンドラーを実行する必要があります。モジュールSnap.Test
は以下を提供します:
それで
ちょっと待って!!!私のリクエストハンドラーはタイプですが、タイプのハンドラーAppHandler ()
がrunHandler
必要Snap a
です。AppHandler
タイプをSnap
モナドに持ち上げるにはどうすればよいですか?助けてください、これは一種のトリッピンです。
haskell - サブスナップレットを参照するための推奨される方法
Snap Frameworkでは、Snapletを使用して、コンポーネントベースのインターフェイスを介して他のSnapletに機能を埋め込みます。メインのWebアプリケーションは、従来の「has-a」関係を介して他のSnapletを参照するSnapletであり、サブSnapletは順番に参照できます。他のスナップレット。
さまざまなSnapletの実装を見ると、Snapletを親Snapletに埋め込むためにさまざまなパターンが使用されているのがわかりました。具体的には:
参照の種類。Snapletの実装は、親Snapletとの特定の種類の関係が存在することを前提としています。これは、使用されるReferenceメソッドを介して実施されます(以下を参照)。
わかりやすいリファレンス:
/li>相対レンズ:
/li>
参照方法。Snaplet実装は、そのインターフェースを介して、Snapletデータにアクセスする特定の方法が実施され、さまざまなSnaplet実装がさまざまなメソッドを使用することを強制します。Snapletは、次のことを前提としています。
- データは
MonadState
、Snapletを操作する関数が呼び出されるたびに存在します。 - データはに存在し、ラッパー
MonadState
でラップされます。Snaplet
- 関数を呼び出す時点でaがa
instance HasSubSnaplet MySnaplet
にある場合、Snapletデータを取得する関数を持つそのようなクラス+インスタンスがあります。MySnaplet
MySnaplet
MonadState
- 3.の関数は
MySnaplet -> Snaplet SubSnaplet
代わりにタイプを持っています。 - 3.のようなclass+instanceがあります。これは。を提供します
Lens MySnaplet (Snaplet SubSnaplet)
。 - class+instanceには。が必要
Lens (Snaplet MySnaplet) (Snaplet SubSnaplet)
です。 - class + instanceは、それ
MySnaplet
がアプリケーションの「トップスナップレット」であると想定し、絶対レンズ/参照を必要とします。これは、に含まれているMySnaplet
必要があります。b
MonadSnaplet
- データは
私が見ているように、参照の種類1.スナップレットが読み取り専用の場合は意味があり、2。スナップレットを変更する必要がある場合は意味があります。
さらに、メソッドのクラスを持つMySnaplet
ことは、1つしか持てない場合に意味SubSnaplet
があり、絶対参照を持つことは、データベースなど、コンポーネントとして構成できない可能性があるものに意味がある場合があります。これは、最上位のSnapletのみがアクセスできるためです。クレデンシャルとそうでないもの。ただし、Snapletライターとしてこの仮定を行うことは誤りである可能性があり、代わりに相対参照を使用することに不利な点はありません。
ただし、問題が1つあります。ハッキングに関する既存のスナップレットは、私が行ったこれらの仮定に適合しません。上記のすべての方法は、一見ランダムに、あらゆる種類の状況で使用されます。また、上記の他のいくつかの側面(Snaplet
ラッパーが必要かどうかなど)に長所/短所はありません。
私には、種類2を参照し、方法1、2、5、または6のいずれかがすべての状況で最も理にかなっているように見えます。また、たとえば(2、1)だけを常に使用することにコンセンサスがない理由はわかりません。 。
それで:
Snapletライターとして、新しいSnapletを作成するときにどの方法を使用するか(汎用性があると想定)、および
存在するすべてのSnapletがまだ同じ参照メソッドを使用していない理由は何ですか(コアsnap
パッケージでも、多数の異なるメソッドが使用されています)?
haskell - Snap: フォーム データと「if」の取得
heist でフォームデータを取得する方法を理解できないようです。Haskell の Web フレームワークを調べ始めたばかりですが、ドキュメントは少し... 控えめに言っても不足しています。スナップ Web サイトのスキニー ヘイスト チュートリアルには、フォームについての言及はありません。単純な html フォームが与えられた場合、ハンドラー関数で処理するフォーム データを取得するにはどうすればよいでしょうか? 誰でも私にチュートリアルを教えてもらえますか?Googleはこれについて黙っていますか? または多分短い例...
また、条件付きコントロールに関する情報はどこで入手できますか? たとえば、HTML の特定の部分を条件付きで自分のページに含めたい場合、heist を使用してそれを行うにはどうすればよいでしょうか? 基本的に、「if」はどこにありますか?
ありがとう
haskell - cabalをインストールせずにスナップフレームワークで反復する方法
snap フレームワークは気に入っていますが、試行するたびに「cabal install」を実行するのは嫌いです (小さなコード変更)。
迅速な反復の代替手段はありますか?
haskell - Haskell Snap:ハンドラー内でIOアクションを実行しますか?
たとえば、別のDB.hsファイルにランダムなDB関数があります。このようなもの:
DB.hsをインポートした場合、Site.hsのハンドラー内でこの関数を実行するにはどうすればよいですか?
このようにハンドラーに貼り付けるだけの場合(これは単なる例です):
これは動作しません。ハンドラーに何かを返させたくありません。Personを保存するだけで、何も返さない/レンダリングしないようにします。
それを行う正しい方法は何ですか?
ありがとう。
haskell - TimeoutManager は tryPutMVar を使用して何も入れません
Snap ソース内 Snap.Internal.Http.Server.TimeoutManager
_morePlease フィールドがあるのはなぜですか?
何をし_ <- tryPutMVar morePlease ()
ますか?
haskell - snaplet-環境は常にフォールバックを返します
私は次のような設定をしています:
そして私は私のアプリを次のように始めています
myapp @production
でも、
lookupEnvDefault "config-url" "http://www.microsoft.com"
常に「http://www.microsoft.com」を返します
ファイルを編集して本番エントリを取り出すと、次のエラーが発生します。
与えられた環境名:@productionが設定ファイルに見つかりませんでした。
したがって、構成ファイルを適切に解析していることは明らかです。
haskell - Haskell、Snap: シンプルなスナップレット構造。いつスナップレットを使用し、いつライブラリを使用しますか?
シンプルなスナップレットの構造を理解しようとしています。また、実際にスナップレットを作成する必要があるのはいつですか?また、単純なサイド ライブラリはいつ作成する必要がありますか? また、ライブラリが必要な場合は、どうすればライブラリから作成できますか?
たとえば、以下のように SQL コードをラップする一連の DB 関数があります。
すべての関数は新しい接続を開始し、コミット後に接続を閉じます。スナップレットを作成することは、すべての機能で接続を回避する方法だと思いますか? 私のハンドラーでは、次のように使用します。
これまでのところ動作します。私の質問は次のとおりです。実際にライブラリをスナップレットに変更する必要があるのはいつですか? すべての関数で接続を確立するのではなく、接続を初期化するためだけに、単純な DB ライブラリをスナップレットに変換する必要がありますか?
さて、スナップレットを作成すると... Snap の Web サイトには、トップレベルのサナプレットの小さな例がありますが、独自の単純なプラグブル スナップレットを作成する方法の痕跡はありません。
そこで、スナップレットの初期化関数を DB ライブラリに追加しました
これは正しい方法ですか?プラグ可能なスナップレットに変換するために必要なのはこれだけですか?
次に、この DB スナップレットをメイン アプリにスタックします。
これで、取得できるのは、リクエスト ハンドラーが利用できる接続だけですよね? したがって、私のハンドラーは次のようになります。
これはうまくいかないようです。私は何を間違っていますか?これは、スナップレット ハンドル (dbcon) から接続を抽出する正しい方法ですか? これは一般的に、単純なスナップレットを作成する正しい方向ですか? 私の場合、ここで実際にスナップレットが必要ですか?
ありがとう。
haskell - Haskell Snap: アプリケーションのデプロイと実行時の依存関係
Snap プロジェクトのソース ディレクトリをクリーンアップする (dist を削除する) と、次のような問題が発生します。
ソースディレクトリをクリーンアップすると、動作しなくなりますか? これは、開発フラグを使用してコンパイルした場合にのみ発生しますか?
これは、スナップ アプリケーションの展開の問題につながります。実際にサーバーに再同期するのは何ですか?実行時の依存関係は何ですか? もちろん、展開サーバーに haskell プラットフォーム全体をインストールしたくありません。サーバー上で必要なのは、プロジェクトの実行可能ファイルと、*.tpl、*.css などの静的ファイルだけです。これは正しいですか?
アプリケーションをデプロイする方法は 2 つあります。実行可能ファイルとその依存関係を rsync する方法と、バイナリ配布用の tarball を作成してサーバーに移動する方法です。一般的な慣行は何ですか?
すべての実行時の依存関係を満たすために、バイナリ tarball または rsync スクリプトに正確にどのファイルを含める必要がありますか?
ありがとう
haskell - Haskell Snap:セッションの例
スナップセッションの使い方の例を探し回っています。今のところ何もありません。誰かが私にCookieベースのセッションの簡単な例を含む記事や何かを教えてもらえますか?
コードスニペットは非常に応用されます。セッションにユーザー名を入れて、すべてのリクエストの前にその存在と有効性をチェックするようなものです。私はSnap.extension.sessionを見ましたが、ライブラリコードだけからそれを使用する方法を理解するにはまだ初心者です。
setInSessionがセッション値をCookieに入れる関数であることは理解していますが、署名からそれを使用する方法を完全に理解することはできません。
または全体を一緒に接着する方法。
少しのサンプルコードを要求することが規則に違反しているかどうかはわかりませんが、ネット上で何かを見つけることができれば、それはしません。
前もって感謝します。
- - アップデート - -
以下の例とリンクをたどりましたが、まだうまくいきません。
キーと値を読み取り、それをセッションCookieに入れる簡単なテストが必要なだけです。次に、セッション値を読み取って表示します。
そこで、セッションを初期化し、メインアプリケーションの状態にしました。
最初の混乱は、セッション初期化機能が必要とする鍵です。キーは、プロジェクトの初期設定時に作成されません。
では、どうすれば作成できますか?関数がキーを見つけられるように、プロジェクトファイル構造のどこにキーを配置する必要がありますか?
次に、ハンドラー:
これは、Webフォームからキーと値を読み取るだけで、キーと値のペアをCookieに入れることになっています。まあ、どうやらそうではありません。
これはそれを読み返して表示するだけです。私はいつも空の文字列を受け取ります。これはそのようなことはないことを意味します。
上記のいずれかが正しくないように見えますか?どこを間違えますか?すべて正しくコンパイルされますが、セッションCookieがありません。