_onichannn

【socket.io/Express】でのセッション共有。

が下記に詳しく書いてあったのでペタリ。

http://jxck.hatenablog.com/category/node.js?page=1315638604

 

【Node.js/Apache】一つのサーバーで双方を共存させる。

Node.jsとApacheを一つのサーバーで共存させるためには、apache側かNode側のいずれかでリバースプロキシを構築してやる必要がある。
今回はNode.jsのsocket.ioを用いたwebsocket通信を行いたかったので、評判の良いNodeのプラグイン「http-proxy」を導入してみた。

今回の想定はNodeのアプリケーションをポート3000番、
Apacheのアプリを9000番で動作させる想定。

まずはhttpd.confのリッスンポートとバーチャルホストのポートを80番以外に避難させる。

・/etc/httpd/conf/httpd.conf

NameVirtualHost *:9000
Listen 9000

そしてバーチャルホストの設定も変更。

<VirtualHost *:9000>
    ServerName example.local
    DocumentRoot /path/to/root/dir
    RewriteEngine On
    <Directory "/path/to/root/dir">
        Options Indexes FollowSymlinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

次にNodeのサーバースクリプトを書く。

var httpProxy = require('http-proxy');

var proxy = httpProxy.createProxy();

var options = {  
    'hoge.local.lcl': 'http://localhost:9000',
    'fuga.local.lcl': 'http://localhost:9000',
    'piyo.local.lcl': 'http://localhost:9000',

    'node.local.lcl': 'http://localhost:3000'
}

require('http').createServer(function(req, res) {
    
    if (req.headers.host == 'nodechat.local.lcl') {
        proxy.ws(req, socket, head, {
            target: options[req.headers.host]
        });
    } else {
        proxy.web(req, res, {
            target: options[req.headers.host]
        });
    }
    
}).listen(80);

console.log('Proxy works.');

あとはこのスクリプトをnodeコマンドで起動すればOK。

 

【AngularJS/socket.io】を用いてウェブソケットアプリを構築する際。

ioのコネクションインスタンスをdiで注入してやらないと正常に動作しないので注意。

下記のようなファクトリーを定義してやればOK。

coreApp.factory('coreSocket', function($rootScope) {
    var socket = io.connect();
    return {
        on: function(eventName, callback) {
            socket.on(eventName, function() {
                var args = arguments;
                $rootScope.$apply(function() {
                    callback.apply(socket, args);
                });
            });
        },
        emit: function(eventName, data, callback) {
            socket.emit(eventName, data, function() {
                var args = arguments;
                $rootScope.$apply(function() {
                    if (callback) {
                        callback.apply(socket, args);
                    }
                });
            });
        }
    };
});
1

これを適宜コントローラーに注入してやればOK。

コントローラーはかきのような感じ。(適当に書いたやつまんまコピペ

1
coreCtrls.controller('indexCtrl', function($scope, coreSocket, $timeout) {
    
    var chatContainer = angular.element('.messages-container');
    $scope.chatStage = '';
    
    $scope.remark = function($event) {
        if ($event.type == 'keypress' && $event.which != 13) {
            return false;
        }
        coreSocket.emit('chatPosted', $scope.message);
        $scope.message = null;
    }
    
    coreSocket.on('chatPosted', function(msg) {
        $scope.chatStage += msg + '\n';
        $timeout(function() {
            chatContainer.scrollTop(chatContainer[0].scrollHeight);
        });
    });
    
    coreSocket.on('disconnect', function() {
        coreSocket.disconnect();
    });
    
});

サーバーサイドはこんな感じ。

io.on('connection', function(socket) {
    
    console.log('a user connected');
    
    socket.on('disconnect', function() {
        
        console.log('user disconnected');
    });
    
    socket.on('chatPosted', function(msg) {
        console.log(msg);
        io.emit('chatPosted', msg);
    });
    
});

ログインユーザーとかルームとかの概念はまだまだ調査ガ必要だなぁ。

 

【Node.js】socket.ioでリアルタイムアプリケーションを作成する。

socket.ioをインストールしてサンプルアプリケーションを真似してみる。

詳細は下記。

http://socket.io/get-started/chat/

onとemitの概念が理解できればめっちゃ簡単。

 

【Node.js】でSQLインジェクションを防ぐ方法。

を調べていたらこんな投稿を発見。

http://stackoverflow.com/questions/15778572/preventing-sql-injection-in-node-js

The node-mysql library automatically performs escaping when used as you are already doing.

ということで、node-mysqlのライブラリは自動的にエスケープ処理をしてくれているとのこと。

これで安心だね。

 

【Javascript/Css】bootstrap3をホスティングしてくれているサービス。

http://www.bootstrapcdn.com/

ありがたや。

 

【Webサービス】ブックマークレットを作った。

自分が普段良く使うやつとかあったら便利だなと思った機能を作ってまとめてみた

公式HPは下記。

http://xn--lvq.net/

俺.net。

随時、機能追加予定。

 

【Node.js】mysqlに接続する。

めも。

var mysql = require('mysql');
var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'admin',
    database: 'hoge'
});

// mysqlに接続する。
connection.connect(function(err) {
    // 接続完了。

    // もろもろの処理

    // コネクションクローズ
    connection..end();
});

SQLを発行したい場合は下記の通り。

var data = {
    title: 'test',
    name: 'bob',
    age: 18
};

// connection.query()を実行した時点でSQLは実行されている。
var query = connection.query('insert into tableName set ?', data, function(err, result) {

});

// queryには生成されたSQLが入っているので、ログ出力するとみることが出来る。
console.log(query);

ちなみにquery()メソッドの中でconnect()メソッドが自動で走るため、事前にconnect()を記述していると2重コネクションになりエラーとなるので注意。