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のサンプルが一番参考になった。これをベースにサイト作れそう。

セキュリティ

CSRF対策 express-csrf

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の日本語ドキュメントがとても役にちました。