はかせだけど博士じゃない

無職が就活しないでプログラミングとかする

N予備校のプログラミング入門メモ8

はじめに

昨日は休憩とか言って寝てしまった。

ちなみにこのメモは後から「あの話どの講座に載ってたっけ?」っていう際の索引も兼ねてるつもりなんだけど、どう書いたら効率がいいのかいまいちわからない。

3章 サーバーサイドプログラミング入門

19.UI、URI、モジュールの設計

  • 要件からURIの構成を検討
  • リダイレクトの実装
  • モジュール構成を検討
    • routerはリクエストを処理に振り分けるモジュール(ルーティング)
    • 処理をする関数をリクエストハンドラ

20.フォームによる投稿機能の実装

  • モジュールを分割した時のrequireでのパスの指定方法

どうでもいいけどレスポンスのヘッダを記述する関数writeHeadwhiteHeadtypoした。

リダイレクトの実装のところでステータスコードが302ではなく303なのでtypoかと思ったが「See Other」というコードらしい。

303 は POST でアクセスした際に、その処理の終了後、 GET でも同じパスにアクセスし直してほしい時に利用するステータスコード

POSTメソッドの処理を実装したがログにundefinedが出力された。

投稿されました: undefined

dataイベントで受け取った値を標準出力して確認したところ、textareaタグのname属性の名前をtypoしていた。小規模なアプリだったのでハマることもなかったが、そこそこの規模になると気づくまで長そう。

この講座でディレクトリ構成はこんな感じになった。

./index.js
./lib
./lib/posts-handler.js
./lib/router.js
./test.js
./views
./views/posts.jade

練習問題、cloneしてからnpm installし忘れててサーバ起動時にエラーが出てちょっとハマった。

21.認証された投稿の一覧表示機能

  • http-authを利用して認証を実装する
  • 実装優先のためパスワードを平文で保存
    • セキュリティは後で解説とのこと
  • ログアウトのリンクを追加して、/logoutにアクセスした際に401を返すように実装
  • 実装されていないURLに404を返すように実装(routerのswitch文のdefault)
  • jadeのiteration機能で投稿内容一覧を表示

jadeのiteration

h2 投稿内容
each content in contents
  p #{content}
  hr

for in文?っぽいのでわかりやすい。jaderenderFile関数の第二引数にオブジェクトを渡して動的にHTMLを生成する。

練習問題で未対応のメソッドの時にその旨を表示する関数を実装したがmodule.exportsに定義し忘れてエラーが出た。またやりそう。

22.データベースへの保存機能の実装

apt-getの-yオプション

apt-get-yというオプションがついていた。yes/noの質問にyesで答えるオプションとのこと。

PostgleSQLインストール後の一連の流れ(?)

  1. sudu su - postgres Linuxユーザーを変更?
  2. psql ターミナル型フロントエンド?を起動
  3. PostgreSQL内ユーザーpostgresのパスワードを変更

急に何かを始めた。とりあえず進めるが後でちょっと調べる。

psql

postgresというユーザーでpsqlを起動する。ユーザーの切り替え?はsudo su - postgrespsqlの起動はpsql

psqlcreate database <db_name>;でDBを作成、psql\qで終了できる。

ユーザーを元に戻す際にexitした。vagrantユーザーからpostgresにログインしたので、exitpostgresを閉じてvagrantに戻ってきた、という感じだと思う。

やっぱりnpm installが失敗する

どうもホストのWindowsと共有しているディレクトリ内でnpm installすると失敗する確率が上がるっぽい。とりあえず引き続きホームに適当に切ったディレクトリ内にコピーしてnpm installしてnode_modulesディレクトリをコピーするみたいな方法をとっているが、npm install なんちゃら --saveするとpackage.jsonも更新されたりして面倒なのでプロジェクトディレクトリごとコピーした方がよさそう。

SequelizeでDB上にデータを作る

  1. モデル定義のドキュメントを参考にモデルを定義する
  2. モデル(例ではPostモジュール)のcreate関数を呼び出す

結構簡単っぽい。参考

PostgreSQLに作られたデータを確認する

  1. DBを作ったユーザー(postgres)にログイン
  2. psqlを起動
  3. 作ったDB(secret_board)に接続
    • \c secret_board
  4. SQLのselect文で表示できる
    • select * from "Post";

SequelizeでDBを扱う

モデルのfindAll関数を呼び出すと全要素を取得する。thenでつないで取得後の処理を書く(ここではjaderenderFileを、取得したpostsを与えて呼び出す)。

findAll関数に{order: 'id DESC'}というオブジェクトを渡すと、idDESC(降順)になる。

DBの初期化

変なことになったら以下を実行する

drop database secret_board;
create database secret_board;

ちょっと長くなってきたのでいったん投稿する。