N予備校のプログラミング入門メモ8
はじめに
昨日は休憩とか言って寝てしまった。
ちなみにこのメモは後から「あの話どの講座に載ってたっけ?」っていう際の索引も兼ねてるつもりなんだけど、どう書いたら効率がいいのかいまいちわからない。
3章 サーバーサイドプログラミング入門
19.UI、URI、モジュールの設計
20.フォームによる投稿機能の実装
- モジュールを分割した時の
require
でのパスの指定方法
どうでもいいけどレスポンスのヘッダを記述する関数writeHead
をwhiteHead
にtypoした。
リダイレクトの実装のところでステータスコードが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文?っぽいのでわかりやすい。jade
のrenderFile
関数の第二引数にオブジェクトを渡して動的にHTMLを生成する。
練習問題で未対応のメソッドの時にその旨を表示する関数を実装したがmodule.exports
に定義し忘れてエラーが出た。またやりそう。
22.データベースへの保存機能の実装
- PostgreSQLをインストール
psql
でDBを作成sequelize
をインストールしてJSからDBを扱う- モデル定義のドキュメント
apt-getの-yオプション
apt-get
に-y
というオプションがついていた。yes/noの質問にyesで答えるオプションとのこと。
PostgleSQLインストール後の一連の流れ(?)
sudu su - postgres
Linuxユーザーを変更?psql
ターミナル型フロントエンド?を起動- PostgreSQL内ユーザー
postgres
のパスワードを変更
急に何かを始めた。とりあえず進めるが後でちょっと調べる。
psql
postgres
というユーザーでpsql
を起動する。ユーザーの切り替え?はsudo su - postgres
、psqlの起動はpsql
。
psql
でcreate database <db_name>;
でDBを作成、psql
は\q
で終了できる。
ユーザーを元に戻す際にexit
した。vagrant
ユーザーからpostgres
にログインしたので、exit
でpostgres
を閉じてvagrant
に戻ってきた、という感じだと思う。
やっぱりnpm installが失敗する
どうもホストのWindowsと共有しているディレクトリ内でnpm install
すると失敗する確率が上がるっぽい。とりあえず引き続きホームに適当に切ったディレクトリ内にコピーしてnpm install
してnode_modules
ディレクトリをコピーするみたいな方法をとっているが、npm install なんちゃら --save
するとpackage.jsonも更新されたりして面倒なのでプロジェクトディレクトリごとコピーした方がよさそう。
SequelizeでDB上にデータを作る
- モデル定義のドキュメントを参考にモデルを定義する
- モデル(例では
Post
モジュール)のcreate
関数を呼び出す
結構簡単っぽい。参考
PostgreSQLに作られたデータを確認する
- DBを作ったユーザー(
postgres
)にログイン psql
を起動- 作ったDB(
secret_board
)に接続\c secret_board
- SQLのselect文で表示できる
select * from "Post";
SequelizeでDBを扱う
モデルのfindAll
関数を呼び出すと全要素を取得する。then
でつないで取得後の処理を書く(ここではjade
のrenderFile
を、取得したposts
を与えて呼び出す)。
findAll
関数に{order: 'id DESC'}
というオブジェクトを渡すと、id
でDESC
(降順)になる。
DBの初期化
変なことになったら以下を実行する
drop database secret_board; create database secret_board;
ちょっと長くなってきたのでいったん投稿する。