node.js + express + mongodb Error: ECONNREFUSED, Connection refused が発生
少しはまったのでメモ。
ubuntu環境から、Mac OS X 環境に移行したところ
ubuntuではでなかったタイトルのエラーが、Mac OS X で発生
結論から書くと、mongodbがインスコされて起動されていなかったため。
node.js:50 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: ECONNREFUSED, Connection refused at Stream._onConnect (net.js:687:18) at IOWatcher.onWritable [as callback] (net.js:284:12)
mongodbはちゃんと起動しておきましょう。
なんのコネクションかよくわからんかった(WebSocketとかだとおもった)ので、ちとはまったけど今後同じ現象がでてもすぐわかりそうだ。
node.js + express でログイン状態を判断して、表示する文字を変える
共通ヘッダーなどでログイン状態で表示文字をかえたいときなどに便利です。
方法はdynamicHelpersというメソッドを使います。
※ほかに方法があれば教えてください!
これは、viewをrenderする際に動的な情報を埋め込む事ができます。
共通のテンプレートにrequest情報を渡すときに便利です。
以下例ではログインしていたら、true、を返すメソッドを作成してテンプレート側でそのメソッドを使用して、ログインしている場合とログインしていない場合で表示を切り替えています。
以下では req.session.user にログインした際に、user情報を保持しているものとします。 vi app.js ----- : : app.dynamicHelpers({ // check login state is_logined: function(req, res){ return req.session.user ? true : false; } }); : : ----- headerを呼び出すレイアウトejs vi layout.ejs ----- : : <div id="header"><%- partial('header') %></div> <div id="body"><%- body %></div> <div id="footer"><%- partial('footer') %></div> : : ----- dynamicHelpersのメソッドを使用しているejs vi header.ejs ----- <% if (is_logined) { %> <a href="/auth/logout">Logout</a> <% } else { %> <a href="/auth/login">Login</a> <% } %> -----
以下のようにrequest情報をわたせなくもないですが
res.render('index', { locals: { req: req } });
headerのような場所で参照する変数は、renderする箇所で全部かかなければいけないのでdynamicHelpersの方が便利だと思われます。
というか書いててきずいたんですが、requestそのまま渡せばrequest情報つかってテンプレート側でなんでもできるな(汗
このあたりは設計指針というとこでしょうか。何かと便利なのでrequestわたせるようにしとこう。
vi app.js ----- : : app.dynamicHelpers({ // check login state req: function(req, res){ return req; } }); : : ----- vi header.ejs ----- <% if (req.session.user) { %> <a href="/auth/logout">Logout</a> <% } else { %> <a href="/auth/login">Login</a> <% } %> -----
node.js + express + mongoDB + WebSocket などのリンクまとめ
環境設定等
・Ubuntu+nginxでnode.js+npmのインストールからデプロイまで
Ubuntuで構築しているので参考になった。
本記事のコメント欄も興味深いコメントが
nodejs1プロセスだとブロッキングすると終わるのでfugueなどを使う方がいい。websocket使うならhaproxy使うこと
・node.js のホスティングサービスまとめ
node.js + Express
テンプレート
ログイン認証
・Node.js+Express+Mongoose(MongoDB)でログイン認証
簡単なユーザー認証の仕方のサンプルソース有り
・expressの本家サイト, Passing Route Control
ログイン状態の有無によって、処理かえたりできるサンプル
・express/examples at master · visionmedia/express · GitHubExpress サンプルソースのauthが使える
OAuth
・TwitterのOAuth
node-oauthを使ってTwitter認証。文章中盤の「ログイン」
サンプルページ
・本家のサンプルサイト
とにかくここのサンプルは一通り目を通しておきたい
個人的にはmvcのサンプルが一番参考になった。これをベースにサイト作れそう。
セキュリティ
DB周り
mongoDB
・本家
・本家日本語翻訳
・MongoDBにおける関連(Relation)のスキーマ設計
・MongoDB Schema Design
具体的な事例とともに、スキーマの考え方が書いてあるのでわかりやすい。
・MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを使うメリットがわかる
WebSocket
・HTTP と WebSocket でセッションを共有する
・node.js+socket.ioでライブコーディング的なものを作るメモ
・第1回 node.jsの衝撃とWebSocketが拓く未来
WebSocket の概要がよくわかる。
expressのejsで部分テンプレート(partial)を使う方法
新規事業のシステムで、node.jsを使うことになったので
(まぁ、技術全般はまかされてるので、勝手にnode.js使うかぁ、的なのりで使ってるんだけどね)
node.js + express
とかでぐぐっていろいろ調査してサイト作ってみている。
node.jsのFWではexpressがメジャーそうなのでとりあえずexpressを使ってみる事に。
expressではテンプレートエンジンがいろいろ種類あるらしいのだけど
Jadeがデフォルトでは(expressコマンドで何も指定しないとJadeになる)使われてしまうがよりHTMLの形に近いejsを使ってみる事に。
その際に、ejsのpartialを使う方法があまりWEBに情報が乗っていなかったのでメモしておく。
手順
ubuntu10.4上で試した。
node.js, express のインスコはこのあたりを参考にした。
$ mkdir sample $ express -t ejs sample create : sample create : sample/app.js create : sample/pids create : sample/logs create : sample/public/javascripts create : sample/public/images create : sample/public/stylesheets create : sample/public/stylesheets/style.css create : sample/views/partials create : sample/views/layout.ejs create : sample/views/index.ejs create : sample/test create : sample/test/app.test.js - make sure you have installed ejs: $ npm install ejs $ cd sample $ vi app.js ----- app.get('/', function(req, res){ res.render('index', { locals: { title: 'Express', templ: res.partial('templ.ejs') <-----ここ追加!!!!!!! } }); }); ----- $ vi views/partials/templ.ejs ----- Include Template !!!!!!! ----- $ vi views/index.ejs ----- <h1><%= title %></h1> <p>Welcome to <%= title %></p> <%= templ %> ----- $ node app.js Express server listening on port 3000
http://localhost:3000/
にアクセスして
-
-
-
- -
-
-
Express
Welcome to Express
Include Template !!!!!!!!!!!!
-
-
-
- -
-
-
とか画面にでてきたら成功。
■追記
以下のような書き方ができた。こっちの方がシンプルです。
vi layout.ejs ----- <!DOCTYPE html> <html> : : <div id="header"><%- partial('header') %></div> <div id="body"><%- body %></div> <div id="footer"><%- partial('footer') %></div> : : </html> ----- vi header.ejs ----- HEADER !!!! ----- vi footer.ejs ----- FOOTER !!!! ----- layout.ejsと、header.ejs, footer.ejs を同じディレクトリにおいておけばOK
djangoでモデル変更する時に、DB定義も変更
djangoでモデル変更する時に、DB定義も変更したかったのでいろいろ探してみると以下があるらしい。
South
django-evolution
dmigrations
id:nullpobug に聞いてみたところSouthがよさそうとのことで、South使ってみる
以下でもSouthがよいとかいってるな。
http://stackoverflow.com/questions/853248/how-can-you-migrate-django-models-similar-to-ruby-on-rails-migrations
install
easy_install South
Southのテーブルを作成
models.pyにモデルを書いた後syncdbを行うとmigrateするテーブルも事前に作られてしまいmigrateできなくなる。
このためstartapp前(正確にはmodels.pyにモデルを書く前)にsyncdbを行いsouthのテーブルをDBに作成しておく。
すでにmodels.pyを作成してしまっている場合は、settings.pyに書いたINSTALLED_APPSの自作モデルをコメントアウトしてsyncdbを行う。その後、コメントアウトを戻してinitialを行い、migrateするとうまくいく。
django-admin.py startproject mysite cd mysite vi settings.py ----- southを追加 INSTALLED_APPS = ( 'django.contrib.auth', : 'south', : ) ----- python manage.py syncdb <- ここでsouthのテーブルを作成 python startapp southtut polls.models.pyの作成 ----- from django.db import models class Knight(models.Model): name = models.CharField(max_length=100) of_the_round_table = models.BooleanField() -----
migrateを試す
migrateの準備
まず初期ファイルを作成 $ ./manage.py schemamigration southtut --initial Creating migrations directory at '/home/andrew/Programs/litret/southtut/migrations'... Creating __init__.py in '/home/andrew/Programs/litret/southtut/migrations'... + Added model southtut.Knight Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate southtut そしてmigrateファイル実行 $ ./manage.py migrate southtut
実際にモデル変更してみる
モデルの変更 ----- from django.db import models class Knight(models.Model): name = models.CharField(max_length=100) of_the_round_table = models.BooleanField() dances_whenever_able = models.BooleanField() ----- migrateファイル作成 $ ./manage.py schemamigration southtut --auto + Added field dances_whenever_able on southtut.Knight Created 0002_auto__add_field_knight_dances_whenever_able.py. You can now apply this migration with: ./manage.py migrate southtut migrate実行 $ ./manage.py migrate southtut Running migrations for southtut: - Migrating forwards to 0002_auto__add_field_knight_dances_whenever_able. > southtut:0002_auto__add_field_knight_dances_whenever_able - Loading initial data for southtut.
DBにモデルの変更が反映されていることが確認できた。
@AE35の日本語ドキュメントがとても役にちました。
テンプレート
以下のような記載
{{ request }}
views.py
direct_to_template を使用
from django.views.generic.simple import direct_to_template def index(request): return direct_to_template( request, 'index.html', )