RESTなWebAPI作るためのフレームワークなのにSocket.IO使うっていうケースがどの程度あるのかわからないけれど、日本語情報が無かったのでメモ。
本記事は東京Node学園入学式2015の時にLTした内容『Loop backを使った極初歩的なapiとswiftで作るオシャレアプリ()』の延長版です。
いくつか未検証事項もあるけどご容赦を。
記述漏れ等で「動かねーぞ!」って時はコメントください。
前提
- loopback: 2.8.0
- socket.io: 1.3.5
- io.js: 1.5.x
動作確認は
- MacOSX 10.10
- Heroku
にて行いました。
slc loopback
して雛形生成してある状態から作業を始めます。
Socket.IOの利用方法
多分実用的な実装方法の紹介です。
インストール
npm install socket.io --save
で普通にインストール
server.jsのboot関数を以下のように編集する
次のブートストラップ処理でサーバインスタンスを参照できるようにserver.js
を修正する。
boot(app, __dirname, function (err) {
if (err) {
throw err;
}
// start the server if `$ node server.js`
if (require.main === module) {
// app.serverでサーバインスタンスにアクセスできるようにする
app.server = app.start();
}
});
Socket.IOのブートストラップを書く
server/boot/
以下にファイルを置くと(たぶんloopback-bootモジュールが)読み込んでくれる。
module.exports = function (app) {
app.on('started', function () {
app.io = require('socket.io').listen(app.server);
// server/socketio/index.jsを読み込む
// 第2引数のapp.ioはappに含まれるので引数1つで大丈夫だと思う
// (未検証なので動作確認時のまま記載)
require('../socketio/')(app, app.io);
});
};
Socket.IOの実処理を書く
上記でserver/socketio/index.js
を読み込むように実装したので処理を記述する。
直接index.js
に処理を実装してもいいけれど、機能ごとにファイル分割できるようにする。
module.exports = function (app, io) {
// 実際の処理が記述されたファイルを読み込む
require('./pink-noise')(app, io);
// 機能が増えたらここに追記していく
};
module.exports = function (app, io) {
io.on('connection', function (socket) {
// あとは普通通りにSocket.IOの実装をすすめる
console.log('connect...');
socket.on('disconnect', function () {
console.log('disconnect...');
});
socket.on('hogehoge', function () {
// hogehoge
});
});
};
参考文献
LoopbackJS > Loopback with socketio - Google Groups
ここに投稿されていた内容を自分好みにアレンジして利用させてもらいました。