ä»æ¥ãWebãã¯ãããžãŒã®æ¥éãªéçºæéäžãçµéšè±å¯ãªããã³ããšã³ãéçºè
ã¯åžžã«ãã¬ã³ãã«ãšã©ãŸããç¥èãæ¥ã
æ·±ããŠããå¿
èŠããããŸãã ãããããŠã§ãã®äžçã§æ
ãå§ããã°ããã®å Žåã¯ã©ãã§ããããïŒ æ¢ã«ã¬ã€ã¢ãŠãã«åé¡ããããããã§åæ¢ããããªãå Žåã JavaScriptã®ç¥ç§çãªäžçã«åŒãä»ããããŸãïŒ ãããããªãã®ããšãªãããã®èšäºã圹ã«ç«ã€ããšãé¡ã£ãŠããŸãã
ããã³ããšã³ãéçºè
ãšããŠ1幎åã®çµéšããããç§ã¯å¥ã®éåžžã®ãããžã§ã¯ãã®å調ãªã¬ã€ã¢ãŠãã«ããããããŠãWebããã°ã©ãã³ã°ã®åéã§ã®ç¥èãæ·±ãå§ããŸããã æåã®åäžããŒãžã¢ããªã±ãŒã·ã§ã³ãäœæããããšæã£ãŠããŸããã ãã¯ãããžãŒã¹ã¿ãã¯ã®éžæã¯æããã§ãããNode.jsã«ç§ã¯ãã€ãç¡é¢å¿ã§ã¯ãªãã£ããããMEANæ¹æ³è«ã¯å»åž«ãåŠæ¹ãããã®ã«ãªããŸããã
ä»æ¥ãã€ã³ã¿ãŒãããã«ã¯ãhelloworldãtodoã管çæ©é¢ãªã©ã®ã¢ããªã±ãŒã·ã§ã³ãäœæããããŸããŸãªãã¥ãŒããªã¢ã«ããããŸãã ãã ãããã¥ãŒããªã¢ã«ã®æé ãç¡æèã«å®è¡ããããšã¯ãç§ã®éžæã§ã¯ãããŸããã ããçš®ã®ã¡ãã»ã³ãžã£ãŒãäœæããããšã«ããŸãããæ°ãããŠãŒã¶ãŒã®ç»é²ããŠãŒã¶ãŒéã®ãã€ã¢ãã°ã®äœæããã¹ããŠãŒã¶ãŒçšã®ãã£ããããããšã®éä¿¡ãå¯èœãªã¢ããªã±ãŒã·ã§ã³ã§ãã ããã§ãè¡åèšç»ãæ
éã«èãåºããŠãä»äºã«åãæãããŸããã
ããã«ãç§ã®ã¹ããŒãªãŒã§ã¯ããã®ã¢ããªã±ãŒã·ã§ã³ãäœæããäž»ãªãã€ã³ãã«ã€ããŠèª¬æããŸããæ確ã«ããããã«ãããã§ã¯ãã¢ãæ®ããŸã ïŒ githubãžã®ãªã³ã¯ ïŒã
*ãŸãããã®èšäºã®ç®çã¯ããããããç§ãäžåºŠèžã¿èŸŒãã çæãèžãŸãªãããã«ããããšãšãçµéšè±å¯ãªéçºè
ãã³ãŒãã衚瀺ããŠã³ã¡ã³ãã§æèŠãè¡šæã§ããããã«ããããšã§ãã
ã¢ã¯ã·ã§ã³ãã©ã³ãäœæããŸãããã
- æºåäœæ¥
- èªå¯ã·ã¹ãã ã®äœæ
- Angular2ãšSocket.ioã§ãã£ãããã
æºåäœæ¥
è·å Žã®æºåã¯ããããéçºã®äžå¯æ¬ ãªããã»ã¹ã§ããããã®ã¿ã¹ã¯ã®è³ªã®é«ãå®è£
ã¯å°æ¥ã®æåã®éµã§ãã ãŸããExpressãã€ã³ã¹ããŒã«ãããããžã§ã¯ãçšã«åäžã®æ§æã·ã¹ãã ãæ§æããå¿
èŠããããŸãã æåã®ãã®ã§ãã¹ãŠãæ確ãªå Žåã¯ã2çªç®ã®è©³çŽ°ã«ã€ããŠè©³ãã説æããŸãã
ãããŠãçŽ æŽãããnconfã¢ãžã¥ãŒã«ã䜿çšããŸãã configãšãããã©ã«ããŒãäœæãããã®ã€ã³ããã¯ã¹ãã¡ã€ã«ã«æžã蟌ã¿ãŸãããã
const nconf = require('nconf'); const path = require('path'); nconf.argv() .env() .file({ file: path.join(__dirname, './config.json') }); module.exports = nconf;
次ã«ããã®ãã©ã«ããŒã§config.jsonãšãããã¡ã€ã«ãäœæãããã®äžã«æåã®èšå®ïŒã¢ããªã±ãŒã·ã§ã³ããªãã¹ã³ããããŒãïŒãäœæããŸãã
{ "port": 2016 }
ãã®èšå®ãã¢ããªã±ãŒã·ã§ã³ã«å®è£
ããã«ã¯ã1è¡/ 2è¡ã®ã³ãŒããæžãã ãã§ãã
const config = require('./config'); let port = process.env.PORT || config.get('port'); app.set('port', port);
ãã ããããŒãã次ã®ããã«æå®ãããŠããå Žåãããã¯æ©èœããããšã«æ³šæããŠãã ããã
const server = http.createServer(app); server.listen(app.get('port'));
次ã®ã¿ã¹ã¯ã¯ãã¢ããªã±ãŒã·ã§ã³ã§åäžã®ãã®ã³ã°ã·ã¹ãã ãæ§æããããšã§ãã ãNode.jsã®ãã®ã³ã°ã«ã€ããŠããšããèšäºã®èè
ãšããŠæ¬¡ã®ããã«æžããŠããŸãã
ãã°ã«ããããæžãå¿
èŠããããŸãã ã¢ããªã±ãŒã·ã§ã³ã®çŸåšã®ç¶æ
ãç解ããããšã¯ã»ãšãã©ãªããã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããå Žåã«ãã®çç±ãç解ããããšãã§ããŸãã
ãã®ã¿ã¹ã¯ã«ã¯ã winstonã¢ãžã¥ãŒã«ã䜿çšããŸãã
const winston = require('winston'); const env = process.env.NODE_ENV; function getLogger(module) { let path = module.filename.split('\\').slice(-2).join('/'); return new winston.Logger({ transports: [ new winston.transports.Console({ level: env == 'development' ? 'debug' : 'error', showLevel: true, colorize: true, label: path }) ] }); } module.exports = getLogger;
ãã¡ãããèšå®ã¯ãã£ãšæè»ãããããŸãããããã®æ®µéã§ã¯ããã§ååã§ãã æ°ããäœæãããã¬ãŒã䜿çšããã«ã¯ããã®ã¢ãžã¥ãŒã«ãäœæ¥ãã¡ã€ã«ã«æ¥ç¶ããé©åãªå Žæã§åŒã³åºãã ãã§ãã
const log = require('./libs/log')(module); log.info('Have a nice day =)');
次ã®ã¿ã¹ã¯ã¯ãéåžžã®ãªã¯ãšã¹ããšajaxãªã¯ãšã¹ãã®æ£ãããšã©ãŒåŠçãèšå®ããããšã§ãã ãããè¡ãã«ã¯ãExpressã以åã«çæããã³ãŒãã«ããã€ãã®å€æŽãå ããŸãïŒãã®äŸã§ã¯ãéçºãšã©ãŒãã³ãã©ãŒã®ã¿ãæå®ãããŠããŸãïŒã
æºåäœæ¥ã¯ã»ãŒå®äºããŸããããå°ããªäœæ¥ã1ã€æ®ã£ãŠããŸããã決ããŠéèŠã§ã¯ãªã詳现ã¯ãããŸãããããŒã¿ããŒã¹ã§äœæ¥ãã»ããã¢ããããããšã§ãã æåã«ã mongooseã¢ãžã¥ãŒã«ã䜿çšããŠMongoDBãžã®æ¥ç¶ãæ§æããŸãã
const mongoose = require('mongoose'); const config = require('../config'); mongoose.connect(config.get('mongoose:uri'), config.get('mongoose:options')); module.exports = mongoose;
mongoose.connectã§ã¯ã 2ã€ã®åŒæ°uriãšoptionsãæž¡ããŸã ããããã¯äºåã«æ§æã§ç»é²ããŸããïŒãããã®è©³çŽ°ã«ã€ããŠã¯ãã¢ãžã¥ãŒã«ã®ããã¥ã¡ã³ããåç
§ããŠãã ãã ïŒã
WebãªãœãŒã¹learn.javascript.ruã®äœæè
ã¯ããããªãã¥ãŒããªã¢ã«ã ãŠãŒã¶ãŒã®ã¢ãã«ã®äœæ/ Mongooseã®åºæ¬ ãã§Node.jsã®ã¹ã¯ãªãŒã³ãã£ã¹ãã§åæ§ã®æ¹æ³ã§ããã»ã¹ã説æããŠããããããŠãŒã¶ãŒã¢ãã«ãšãã€ã¢ãã°ã®äœæããã»ã¹ã«ã€ããŠã¯èª¬æããŸããããŠãŒã¶ãŒã«ã¯ããŠãŒã¶ãŒåãhashedPasswordãsaltããã€ã¢ãã°ãªã©ã®ããããã£ããããäœæãããŸãã 次ã«ãdialogsããããã£ã¯ãªããžã§ã¯ããè¿ããŸãïŒkey-察話è
ã®idãvalue-ãã€ã¢ãã°ã®idã
誰ãããŸã ãããã®ã¢ãã«ã®ã³ãŒããèŠãããšã«èå³ããããªãïŒ
users.js const mongoose = require('../libs/mongoose'); const Schema = mongoose.Schema; const crypto = require('crypto'); let userSchema = new Schema({ username: { type: String, unique: true, required: true }, hashedPassword: { type: String, required: true }, salt: { type: String, required: true }, dialogs: { type: Schema.Types.Mixed, default: {defaulteDialog: 1} }, created: { type: Date, default: Date.now } }); userSchema.methods.encryptPassword = function(password){ return crypto.createHmac('sha1', this.salt).update(password).digest('hex'); }; userSchema.methods.checkPassword = function(password){ return this.encryptPassword(password) === this.hashedPassword; } userSchema.virtual('password') .set(function(password){ this._plainPassword = password; this.salt = Math.random() + ''; this.hashedPassword = this.encryptPassword(password); }) .get(function(){ return this._plainPassword; }); module.exports = mongoose.model('User', userSchema);
dialogs.js const mongoose = require('../libs/mongoose'); const Schema = mongoose.Schema; let dialogSchema = new Schema({ data: { type: [], required: true } }) module.exports = mongoose.model('Dialog', dialogSchema);
æ®ã£ãŠããã®ã¯ãã»ãã·ã§ã³ãã¢ããªã±ãŒã·ã§ã³ã®ããã¯ããŒã³ã«ãã蟌ãããšã ãã§ãã ãããè¡ãã«ã¯ãsession.jsãã¡ã€ã«ãäœæãã express-session ã connect-mongoãªã©ã®ã¢ãžã¥ãŒã«ãããã³mongoose.jsãã¡ã€ã«ããäœæããã¢ãžã¥ãŒã«ããã©ã°ã€ã³ããŸãã
const mongoose = require('./mongoose'); const session = require('express-session'); const MongoStore = require('connect-mongo')(session); module.exports = session({ secret: 'My secret key!', resave: false, saveUninitialized: true, cookie:{ maxAge: null, httpOnly: true, path: '/' }, store: new MongoStore({mongooseConnection: mongoose.connection}) })
ãã®èšå®ãå¥ã®ãã¡ã€ã«ã«çœ®ãããšã¯éèŠã§ãããå¿
é ã§ã¯ãããŸããã ããã«ãããã»ãã·ã§ã³ãšWebãœã±ããããããã®éã§ããã«å°é£ãªã調åãããããšãã§ããŸãã 次ã«ãapp.jsã§ãã®ã¢ãžã¥ãŒã«ãæ¥ç¶ããŸãã
const session = require('./libs/session'); app.use(session);
ããã«ã app.useïŒ cookieParserïŒïŒïŒã®åŸã«app.useïŒã»ãã·ã§ã³ïŒãæå®ããå¿
èŠããããŸããããã«ãããCookieããã§ã«èªã¿åãããŸãã ããã ãã§ãïŒ ããã§ãã»ãã·ã§ã³ãããŒã¿ããŒã¹ã«ä¿åã§ããããã«ãªããŸããã
ããã§æºåäœæ¥ã¯çµãããŸããã 楜ããéšåãå§ããŸãããïŒ
èªèšŒã·ã¹ãã ã®äœæ
æ¿èªã·ã¹ãã ã®äœæã¯ãããã³ããšã³ããšããã¯ãšã³ãã®2ã€ã®äž»èŠãªæ®µéã«åããããŸãã ãã®ã¢ããªã±ãŒã·ã§ã³ãéå§ããŠãããç§ã¯åžžã«æ°ããããšãåŠãŒããšããŠããã®ã§ãAngular1.xã§ãã§ã«çµéšãç©ãã§ããã®ã§ãAngular2ã§ããã³ããšã³ãéšåãæŽçããããšã«ããŸããã ã¢ããªã±ãŒã·ã§ã³ãäœæãããšãããã®ãã¬ãŒã ã¯ãŒã¯ã®4çªç®ïŒãããŠ5çªç®ïŒã®ãã¬ãªãªãŒã¹ããŒãžã§ã³ãæ¢ã«ãªãªãŒã¹ãããŠãããšããäºå®ã¯ããªããªãªãŒã¹ãéè¿ã«è¿«ã£ãŠããããšã«èªä¿¡ãäžããŸããã ãããŠãç§ã®èããéããŠãæ¿èªãæžãããã«åº§ã£ãã
Angular2ã§ã®éçºã«ãŸã ééããŠããªã人ã«ãšã£ãŠã¯ã以äžã®ã³ãŒãã§ããªããç¥ããªãjavascriptæ§æãèŠã€ããŠãé©ããªãã§ãã ããã åé¡ã¯ãAngular2ã®ãã¹ãŠãtypescriptäžã«æ§ç¯ãããŠããããšã§ãã ããããããã¯éåžžã®JavaScriptã䜿çšããŠãã®ãã¬ãŒã ã¯ãŒã¯ãæäœããããšãäžå¯èœã§ããããšãæå³ããŸããïŒ ããšãã°ãçŽ æŽãããèšäºããããŸãããã®éãèè
ã¯ES6ã䜿çšããŠAngular2ã§ã®éçºãæ€èšããŠããŸãã
ããããtypescriptã¯ã¹ã±ãŒãªã³ã°ããjavascriptã§ãã ã³ã³ãã€ã«ãããjavascriptã®ã¹ãŒããŒã»ããã§ãããã®èšèªã¯ãES6ããã³ES7ããã®ãã¹ãŠã®æ©èœããã©ãã¯ãžã£ãã¯ãšã¯ã©ã¹ã䜿çšããå®éã®OOPã匷åãªåæå®ããã®ä»å€ãã®ã¯ãŒã«ãªæ©èœãè¿œå ããŸãã ãããŠãæããããšã¯äœããããŸãããçµå±ã®ãšãããjavascriptã§æå¹ãªãã®ã¯ãã¹ãŠtypescriptã§ãæ©èœããŸãã
ãŸããuser-authenticate.service.tsãã¡ã€ã«ãäœæããŸãããã®ãã¡ã€ã«ã«ã¯æ¿èªãµãŒãã¹ãå«ãŸããŸãã
import { Injectable } from '@angular/core'; import { Http, Headers } from '@angular/http'; @Injectable() export class UserAuthenticateService{ private authenticated = false; constructor(private http: Http) {} }
次ã«ãã¯ã©ã¹å
ã§ãããã€ãã®ã¡ãœãããäœæããŸãïŒloginãlogoutãsingupãisLoggedInã ãããã®ã¡ãœããã¯ãã¹ãŠåãã¿ã€ãã§ãããããããã¿ã€ãpostã®ãªã¯ãšã¹ããé©åãªã¢ãã¬ã¹ã«éä¿¡ããã¿ã¹ã¯ãå®è¡ããŸãã ããããã®è«ççãªè² è·ãæšæž¬ããããšã¯é£ãããããŸããã ãã°ã€ã³æ¹æ³ã®ã³ãŒããæ€èšããŠãã ããã
login(username, password) { let self = this; let headers = new Headers(); headers.append('Content-Type', 'application/json'); return this.http .post( 'authentication/login', JSON.stringify({ username, password }), { headers }) .map(function(res){ let answer = res.json(); self.authenticated = answer.authenticated; return answer; }); }
Angular2ã³ã³ããŒãã³ããããã®ã¡ãœãããåŒã³åºãã«ã¯ã察å¿ããã³ã³ããŒãã³ãã«ãã®ãµãŒãã¹ãå®è£
ããå¿
èŠããããŸãã
import { UserAuthenticateService } from '../services/user-authenticate.service'; @Component({ ... }) export class SingInComponent{ constructor(private userAuthenticateService: UserAuthenticateService, private router: Router){ ... } onSubmit() { let self = this; let username = this.form.name.value; let password = this.form.password.value; this.userAuthenticateService .login(username, password) .subscribe(function(result) { self.onSubmitResult(result); }); } }
ç°ãªãã³ã³ããŒãã³ããããµãŒãã¹ã®åãã€ã³ã¹ã¿ã³ã¹ã«ã¢ã¯ã»ã¹ããã«ã¯ãå
±éã®èŠªã³ã³ããŒãã³ãã«å®è£
ããå¿
èŠããããŸãã
ãããŠããã§ãæ¿èªã·ã¹ãã ãäœæããããã³ããšã³ã段éãçµäºããŸãã
ããã¯ãšã³ãã®éçºãå§ããã«ã¯ãèå³æ·±ãéåæã¢ãžã¥ãŒã«ïŒã¢ãžã¥ãŒã«ã®ããã¥ã¡ã³ã ïŒãããç解ããããšããå§ãããŸãã éåæJavaScripté¢æ°ãæäœããããã®åŒ·åãªããŒã«ãšãªããŸãã
æ¢åã®ã«ãŒããã£ã¬ã¯ããªã«authentication.jsãã¡ã€ã«ãäœæããŸãããã 次ã«ãapp.jsã§ãã®ããã«ãŠã§ã¢ã瀺ããŸãã
const authentication = require('./routes/authentication'); app.use('/authentication', authentication);
次ã«ãèªèšŒ/ãã°ã€ã³ã¢ãã¬ã¹ãžã®æçš¿ãèŠæ±ãããã³ãã©ãŒãäœæããŸãã ããŸããŸãªif ... elseããé·ãã·ãŒããäœæããªãããã«ãäžèšã®éåæã¢ãžã¥ãŒã«ã®waterfallã¡ãœããã䜿çšããŸãã ãã®ã¡ãœããã䜿çšãããšãéåæã¿ã¹ã¯ã®ã³ã¬ã¯ã·ã§ã³ãé çªã«å®è¡ããåã®ã¿ã¹ã¯ã®çµæã次ã®ã¿ã¹ã¯ã®åŒæ°ã«æž¡ããåºåã«å¯ŸããŠæçšãªã³ãŒã«ããã¯ãå®è¡ã§ããŸãã ãã®ã³ãŒã«ããã¯ãæžããŸãããïŒ
const express = require('express'); const router = express.Router(); const User = require('../models/users'); const Response = require('../models/response'); const async = require('async'); const log = require('../libs/log')(module); router.post('/login', function (req, res, next) { async.waterfall([ ... ], function(err, results){ let authResponse = new Response(req.session.authenticated, {}, err); res.json(authResponse); }) }
䟿å®äžãResponseã³ã³ã¹ãã©ã¯ã¿ãŒãäºåã«æºåããŸããã
const Response = function (authenticated, data, authError) { this.authenticated = authenticated; this.data = data; this.authError = authError; } module.exports = Response;
async.waterfallã®æåã®åŒæ°ãšããŠæž¡ãããé
åã«å¿
èŠãªé åºã§é¢æ°ãæžã蟌ãã ãã§ãã ãããã®ãŸãã«ãã®æ©èœãäœæããŸãããïŒ
function findUser(callback){ User.findOne({username: req.body.username}, function (err, user) { if(err) return next(err); (user) ? callback(null, user) : callback('username'); } } function checkPassword(user, callback){ (user.checkPassword(req.body.password)) ? callback(null, user) : callback('password'); } function saveInSession (user, callback){ req.session.authenticated = true; req.session.userId = user.id; callback(null); }
ããã§äœãèµ·ãã£ãŠããããç°¡åã«èª¬æããŸããããŒã¿ããŒã¹ã§ãŠãŒã¶ãŒãæ€çŽ¢ãããªãå Žåã¯ãusernameããšã©ãŒã§ã³ãŒã«ããã¯ãåŒã³åºããŸããæ€çŽ¢ãæåããå ŽåããŠãŒã¶ãŒãã³ãŒã«ããã¯ã«è»¢éããŸãã ãã¹ã¯ãŒããæ£ããå Žåãåã³checkPasswordã¡ãœãããåŒã³åºãããŠãŒã¶ãŒãã³ãŒã«ããã¯ã«è»¢éããŸããããã§ãªãå Žåã¯ããšã©ãŒãpasswordãã§ã³ãŒã«ããã¯ãåŒã³åºããŸãã 次ã«ãã»ãã·ã§ã³ãããŒã¿ããŒã¹ã«ä¿åããæåŸã®ã³ãŒã«ããã¯ãåŒã³åºããŸãã
以äžã§ãïŒ ããã§ãã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒã¯ãã°ã€ã³ã§ããããã«ãªããŸããã
Angular2ãšSocket.ioã§ãã£ãããã
ã¢ããªã±ãŒã·ã§ã³ã®äž»èŠãªã»ãã³ãã£ãã¯ããŒããå®è¡ããé¢æ°ãäœæããããã«ãªããŸããã ãã®ã»ã¯ã·ã§ã³ã§ã¯ããã€ã¢ãã°ïŒãã£ããã«ãŒã ïŒã«æ¥ç¶ããããã®ã¢ã«ãŽãªãºã ãšãã¡ãã»ãŒãžãéåä¿¡ããããã®æ©èœãæŽçããŸãã ãããè¡ãã«ã¯ã Socket.ioã©ã€ãã©ãªã䜿çšããŸããããã«ããããã©ãŠã¶ãŒãšãµãŒããŒéã®ãªã¢ã«ã¿ã€ã ããŒã¿äº€æãéåžžã«ç°¡åã«å®è£
ã§ããŸãã
sockets.jsãã¡ã€ã«ãäœæãããã®ã¢ãžã¥ãŒã«ãbin / wwwïŒExpresså
¥åãã¡ã€ã«ïŒã«æ¥ç¶ããŸãã
const io = require('../sockets/sockets')(server);
Socket.ioã¯web-socketsãããã³ã«ã§åäœãããããçŸåšã®ãŠãŒã¶ãŒã®ã»ãã·ã§ã³ãããã«æž¡ãæ¹æ³ãèãåºãå¿
èŠããããŸãã ãããè¡ãã«ã¯ããã§ã«äœæããsockets.jsãã¡ã€ã«ã«æžã蟌ã¿ãŸãã
const session = require('../libs/session'); module.exports = (function(server) { const io = require('socket.io').listen(server); io.use(function(socket, next) { session(socket.handshake, {}, next); }); return io; });
Socket.io㯠ããã©ãŠã¶ãŒãšãµãŒããŒãåžžã«ããŸããŸãªã€ãã³ãã亀æããããã«èšèšãããŠããŸãããã©ãŠã¶ãŒã¯ãµãŒããŒãå¿çããã€ãã³ããçæããéã«ãµãŒããŒã¯ãã©ãŠã¶ãŒãå¿çããã€ãã³ããçæããŸãã ã¯ã©ã€ã¢ã³ãåŽã®ã€ãã³ããã³ãã©ãäœæããŸãããã
import { Component } from '@angular/core'; import { Router } from '@angular/router'; declare let io: any; @Component({ ... }) export class ChatFieldComponent { socket: any; constructor(private router: Router, private userDataService: UserDataService){ this.socket = io.connect(); this.socket.on('connect', () => this.joinDialog()); this.socket.on('joined to dialog', (data) => this.getDialog(data)); this.socket.on('message', (data) => this.getMessage(data)); } }
äžèšã®ã³ãŒãã§ã¯ãæ¥ç¶ããã€ã¢ãã°ãžã®åå ãã¡ãã»ãŒãžã®3ã€ã®ã€ãã³ããã³ãã©ãŒãäœæããŸããã ãããã®ããããã¯ãããã«å¯Ÿå¿ããé¢æ°ãåŒã³åºããŸãã ãã®ãããconnectã€ãã³ãã¯joinDialogïŒïŒé¢æ°ãåŒã³åºããŸãããã®é¢æ°ã¯ã察話è
ã®IDãæž¡ããµãŒããŒåŽã®åå ãã€ã¢ãã°ã€ãã³ããçæããŸãã
joinDialog(){ this.socket.emit('join dialog', this.userDataService.currentOpponent._id); }
ãã®åŸããã¹ãŠãç°¡åã§ãïŒãã€ã¢ãã°ã«çµåãããã€ãã³ãã¯ãŠãŒã¶ãŒã¡ãã»ãŒãžãå«ãé
åãåãåããã¡ãã»ãŒãžã€ãã³ãã¯æ°ããã¡ãã»ãŒãžãäžèšã®é
åã«è¿œå ããŸãã
getDialog(data) => this.dialog = data; getMessage(data) => this.dialog.push(data);
å°æ¥ããã³ããšã³ãã«æ»ããªãããã«ããŠãŒã¶ãŒã¡ãã»ãŒãžãéä¿¡ããé¢æ°ãäœæããŸãããã
sendMessage($event){ $event.preventDefault(); if (this.messageInputQuery !== ''){ this.socket.emit('message', this.messageInputQuery); } this.messageInputQuery = ''; }
ãã®é¢æ°ã¯ãã¡ãã»ãŒãžã€ãã³ããçæããããã䜿çšããŠéä¿¡ã¡ãã»ãŒãžã®ããã¹ããéä¿¡ããŸãã
æ®ã£ãŠããã®ã¯ããµãŒããŒåŽã®ã€ãã³ããã³ãã©ãèšè¿°ããããšã ãã§ãã
io.on('connection', function(socket){ let currentDialog, currentOpponent; socket.on('join dialog', function (data) { ... }); socket.on('message', function(data){ ... }); })
å€æ°currentDialogããã³currentOpponentã«ãçŸåšã®ãã€ã¢ãã°ãšå¯Ÿè©±è
ã®èå¥åãä¿åããŸãã
察話æ¥ç¶ã¢ã«ãŽãªãºã ã®äœæãå§ããŸãããã ãããè¡ãã«ã¯ã éåæã©ã€ãã©ãªãã€ãŸãåè¿°ã®watterfallã¡ãœããã䜿çšããŸãã ã¢ã¯ã·ã§ã³ã®ã·ãŒã±ã³ã¹ïŒ
åã®ãã€ã¢ãã°ãçµäºããŸãã function leaveRooms(callback){
ãŠãŒã¶ãŒãšãã®å¯Ÿè©±è
ã®ããŒã¿ããŒã¹ããååŸããŸãã function findCurrentUsers(callback) {
æ¢åã®æ¥ç¶/æ°ãããã€ã¢ãã°ã®äœæïŒ function getDialogId(user, opponent, callback){
ã¡ãã»ãŒãžå±¥æŽãååŸããïŒ function getDialogData(dialogId, callback){
äžèšã®é¢æ°ãåŒã³åºããã°ããŒãã«ã³ãŒã«ããã¯ïŒ ããã§ããã€ã¢ãã°ã«æ¥ç¶ããããã®ã¢ã«ãŽãªãºã ãå®æããŸãã;ããšã¯ãã¡ãã»ãŒãžã€ãã³ãã®ãã³ãã©ãŒãèšè¿°ããã ãã§ãã
socket.on('message', function(data){ let message = data; let currentUser = socket.handshake.session.userId; let newMessage = new Message(message, currentUser); currentDialog.data.push(newMessage); currentDialog.markModified('data'); currentDialog.save(function(err){ if (err) log.error('Error in saveing dialog =('); io.to(currentDialog.id).emit('message', newMessage); }) })
ãã®ã³ãŒãäŸã§ã¯ãã¡ãã»ãŒãžããã¹ããšãŠãŒã¶ãŒIDãå€æ°ã«ä¿åããŠããã以åã«äœæããã¡ãã»ãŒãžã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠæ°ããã¡ãã»ãŒãžãªããžã§ã¯ããäœæããé
åã«è¿œå ããæŽæ°ããããã€ã¢ãã°ãããŒã¿ããŒã¹ã«ä¿åãããã®éšå±ã§ã¡ãã»ãŒãžã€ãã³ããçæããŸãããã¡ãã»ãŒãžã
ããã§ã¢ããªã±ãŒã·ã§ã³ã®æºåã¯å®äºã§ãïŒ
ãããã«
ãžããããªãã¯ãŸã ãããèªãã§ããŸããïŒïŒ èšäºã®éã«ãããããããã¢ããªã±ãŒã·ã§ã³ã®äœæã®è©³çŽ°ããã¹ãŠç¢ºèªããæéã¯ãããŸããã§ãããããã¯ããã®åœ¢åŒã«ãã£ãŠç§ã®èœåãå¶éãããŠããããã§ãã ãããããã®äœæ¥ãããªãããWebããã°ã©ãã³ã°ã®åéã§ã®ç¥èã倧å¹
ã«æ·±ããã ãã§ãªããäœæ¥ããå€ãã®åã³ãåããŸããã ã¿ããªãæ°ããããšãé£ããããšãæããããšã¯ãããŸãããåé¡ã«æ
éã«åãçµã¿ããããã¢ããã®è³ªåãåŸã
ã«ç解ãããšãæåã¯çµéšããªããŠããæ¬åœã«è¯ããã®ãäœæã§ããããã§ãã