が下記に詳しく書いてあったのでペタリ。
http://jxck.hatenablog.com/category/node.js?page=1315638604
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。
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);
});
});
ログインユーザーとかルームとかの概念はまだまだ調査ガ必要だなぁ。
socket.ioをインストールしてサンプルアプリケーションを真似してみる。
詳細は下記。
http://socket.io/get-started/chat/
onとemitの概念が理解できればめっちゃ簡単。
を調べていたらこんな投稿を発見。
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のライブラリは自動的にエスケープ処理をしてくれているとのこと。
これで安心だね。
めも。
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重コネクションになりエラーとなるので注意。