Meteorãã¬ãŒã ã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãéçºããããã®ã»ãã¥ãªãã£ãæäŸããããã«èšèšãããå€ãã®ããªãã¯ãšããŒã«ããããŸãã 第1éšã§ã¯ãã³ãŒãã®ãµãŒããŒåŽã®é衚瀺ãèªåå
¬é/å®å
šã§ãªãããã±ãŒãžãå
¬éæã®ã³ã¬ã¯ã·ã§ã³ãã£ãŒã«ãã®é衚瀺ãããã³Meteor.usersã³ã¬ã¯ã·ã§ã³å
ã®ãã«ãã€ã³ã¢ã«ãŠã³ãã·ã¹ãã ã®è©³çŽ°ã«ã€ããŠèª¬æããŸãã
2çªç® -ã¯ã©ã€ã¢ã³ãã«çºè¡ãããloginTokenã«ã€ããŠãã¯ã©ã€ã¢ã³ããä¿¡é Œã§ããã³ãŒããšä¿¡é Œã§ããªãã³ãŒãããµãŒããŒã¡ãœãããHTTPSãforce-sslããã±ãŒãžããã³browser-policyããã±ãŒãžïŒã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ãŒãšX-Frame-OptionsïŒã§ããŒã¿ããŒã¹ãå€æŽãããšãã®ã«ãŒã«ãèš±å¯/æåŠããŸããçµã¿èŸŒã¿ã®ããŒã¿æ€èšŒã¡ã«ããºã ïŒcheckïŒïŒé¢æ°ããã³audit-arguments-checkããã±ãŒãžïŒã
以äžã«èª¬æãããã¹ãŠã¯ãMeteoriteãã€ã³ã¹ããŒã«ãããŠããMeteor 0.7.0.1ã®çŸåšã®ããŒãžã§ã³ã«é©çšãããŸãã ã¡ãªã¿ã«ããã®èšäºã®äŸãæ°ããããŒãžã§ã³ã®Meteorã§æ©èœããªãå ŽåãMeteoriteã䜿çšãããšãèµ·åæã«--releaseã¹ã€ãããæå®ããŠãã®èšäºã®äŸãèŠãããšãã§ããŸãã
$ mrt --release 0.7.0.1
ã³ãŒãã®è£ãé ã
ãããããæãåçŽãªãã®ããå§ããŸããã-ã³ãŒãã®ã¯ã©ã€ã¢ã³ãéšåãšãµãŒããŒéšåã®å€æ§æ§ã Meteorã§ã¯ã¯ã©ã€ã¢ã³ããšãµãŒããŒéã§ã³ãŒããå
±æã§ããŸãããæ¬åœã«å¿
èŠãªå Žåã«ã®ã¿å
±æããã®ãçã«ããªã£ãŠããŸãã ãããžã§ã¯ãèªäœã®æ§é åã¯ãããªã¥ãŒã ã倧ãããªãã«ã€ããŠäœããã®æ¹æ³ã§å¿
èŠã«ãªããã¯ã©ã€ã¢ã³ãã«è»¢éãããããŒã¿éãæžå°ããããšã«å ããŠããµãŒããŒåŽã®ã³ãŒããé ãããšãã§ããŸãã
ãµããã£ã¬ã¯ããªãµãŒããŒãã¯ã©ã€ã¢ã³ããã¯ã©ã€ã¢ã³ã/äºææ§ããããªãã¯ããã©ã€ããŒããã©ã€ãã©ãªããã¹ãïŒããã³ã¡ã€ã³ã*ãã¡ã€ã«ïŒã¯ãç¹å¥ãªæ¹æ³ã§åŠçãããŸãã ããã«ã€ããŠã¯ãããã¥ã¡ã³ã
docs.meteor.com/#structuringyourappã§è©³çŽ°ã«èª¬æãããŠããŸãã ãµãŒããŒäžã§ã®ã¿å®è¡ãããã³ãŒãã®å ŽåããµãŒããŒãã£ã¬ã¯ããªã察象ãšãªãããã¡ã€ã«ã¯ã¯ã©ã€ã¢ã³ãã«è»¢éãããŸããã åæ§ã«ãã¯ã©ã€ã¢ã³ããã£ã¬ã¯ããªå
ã®ãã¡ã€ã«ã®ã³ãŒãã¯ãµãŒããŒã«ã¢ããããŒããããŸããã
ã³ã¬ã¯ã·ã§ã³å®£èšãªã©ã®äžéšã®ã³ãŒãã¯ãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã§äœ¿çšã§ããå¿
èŠããããŸãã ãã®ãããªã³ãŒãã¯ãäºçŽä»¥å€ã®ååã§ãµããã£ã¬ã¯ããªã«é
眮ã§ããŸãïŒlibã«é
眮ããããšãã§ããŸããéãã¯ããã®ãã£ã¬ã¯ããªããã®ãã¡ã€ã«ãä»ãããæ©ãããŠã³ããŒããããããšã§ãïŒã
ãã®äŸã®äžéšãšããŠãcollectionsãµããã£ã¬ã¯ããªã«ã³ã¬ã¯ã·ã§ã³å®£èšãé
眮ããŸãã
æ°ããã¢ããªã±ãŒã·ã§ã³ãäœæããŸãããïŒ
$ mrt create littlesec
ãããŠãèªåçã«äœæããããã¡ã€ã«ãåé€ããŸãã
$ cd littlesec $ rm littlesec.*
ãµããã£ã¬ã¯ããªãµãŒããŒãã¯ã©ã€ã¢ã³ããã³ã¬ã¯ã·ã§ã³ãäœæããŸãã ã³ã¬ã¯ã·ã§ã³ã§ããã¹ãã³ã¬ã¯ã·ã§ã³ã®å®£èšãšãšãã«ãã¡ã€ã«test.jsãè¿œå ããŸãã
Test = new Meteor.Collection('test');
å®éããããžã§ã¯ãã¯ãã§ã«èµ·åã§ããŸãïŒ
$ mrt
ãã©ãŠã¶ã§éããŸãïŒ
localhost ïŒ3000
空çœã®ããŒãžã®ã¿ã衚瀺ãããŸããããã¹ããªããžã§ã¯ãã¯ç©ºã§ã¯ãããŸãããã³ã³ãœãŒã«ããæ¢ã«å©çšå¯èœã§ãã
> Test.find().count() 0
home.htmlãã¡ã€ã«ãã¯ã©ã€ã¢ã³ãã®ãµããã£ã¬ã¯ããªã«è¿œå ããŸãã
<head> <title>littlesec</title> </head> <body> {{> home}} </body> <template name="home"> {{#each test}} <li> <ul>_id:'{{_id}}' name:'{{name}}' value:'{{value}}'</ul> </li> {{else}} <p>Collection Test is empty</p> {{/each}} </template>
ãããŠãhome.jsïŒ
Template.home.test = function() { return Test.find({}); }
ãµãŒããŒã®ãµããã£ã¬ã¯ããª-startup.jsãã¡ã€ã«ïŒ
Meteor.startup(function(){ if (!Test.find({}).count()) { var testValues = [ {name: 'First', value: 1}, {name: 'Second', value: 2}, {name: 'Third', value: 3} ]; testValues.forEach( function(testValue) { Test.insert(testValue); }); } });
ããã§ããã¹ãã³ã¬ã¯ã·ã§ã³ã¯ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã§äœ¿çšã§ãããµãŒããŒã³ãŒãã¯ã¯ã©ã€ã¢ã³ãã«éä¿¡ãããŸããã _idãã£ãŒã«ãã¯ãæ°ããã¬ã³ãŒããæ¿å
¥ããããšãã«èªåçã«çæãããããŒã¿ããŒã¹èå¥åã§ãã
çŸæç¹ã§ã¯ãã³ã¬ã¯ã·ã§ã³ã¯èªã¿åããšæžã蟌ã¿ã®äž¡æ¹ã§å®å
šã«èª°ã§ãå©çšã§ããŸããããã¯ã³ã³ãœãŒã«ãã確èªã§ããŸãã
> Test.findOne({})
ãããŠïŒ
> Test.insert({name: 'Fourth', value: 4})
èªåå
¬é/å®å
šã§ãªãããã±ãŒãžãåé€ãã
äœææã«ãããžã§ã¯ãã«ããã©ã«ãã§æ¥ç¶ãããèªåå
¬éããã³å®å
šã§ãªãããã±ãŒãžã®ãããã§ãçºè¡šããã³ã¬ã¯ã·ã§ã³ã«å®å
šã«ã¢ã¯ã»ã¹ã§ããŸããã æåã®ãã®ã¯ãµãŒããŒäžã«ååšãããã¹ãŠã®ã³ã¬ã¯ã·ã§ã³ããå
¬éããã2çªç®ã®ãã®ã¯ããããå€æŽããããã®å®å
šãªæš©éãäžããŸãã ããã«ãããMeteorãšã©ããããããã¿ã€ãã³ã°ã®ç解ã倧å¹
ã«ä¿é²ãããŸããããã¡ããå®éã®ç掻ã§ã¯åãå
¥ããããŸããããããã£ãŠã
$ mrt remove autopublish $ mrt remove insecure
ãã©ãŠã¶ã®ãã¹ããªããžã§ã¯ãã¯åŒãç¶ã䜿çšã§ããŸãããããŒã¿ã¯ãããŸããã
> Test.find().count() 0
ããã§ãèªåçºè¡ãªãã®éåžžã¢ãŒãã§ã¯ãã¯ã©ã€ã¢ã³ãã¯ãµãŒããŒããŒã¿ã«ã¢ã¯ã»ã¹ã§ãããµãŒããŒã¯ãããçºè¡ããã¯ã©ã€ã¢ã³ãã¯ãµãã¹ã¯ã©ã€ãããå¿
èŠããããŸãã
ã³ã¬ã¯ã·ã§ã³ã®å
¬éãserver / startup.jsãã¡ã€ã«ã«è¿œå ããŸãïŒMeteor.startupïŒïŒã«ãã£ãŠè¿œå ãããé¢æ°ã®å€åŽãšå
éšã®äž¡æ¹ã«é
眮ã§ããŸããéãã¯ãå
¬éãäœæããããšãã§ã-å
¬éãããã³ã¬ã¯ã·ã§ã³ããã®æç¹ã§æ¢ã«ååšããããšãéèŠã§ãïŒïŒ
Meteor.publish('test', function() { return Test.find(); } );
èªåå
¬éããã±ãŒãžããŸã ãããžã§ã¯ãã«æ¥ç¶ãããŠããéã«ã³ã¬ã¯ã·ã§ã³ãå
¬éããããšãMeteorã®éå§æã«ããã«é¢ããèŠåã衚瀺ãããŸãã
I20140131-11:36:07.343(4)? ** You've set up some data subscriptions with Meteor.publish(), but I20140131-11:36:07.388(4)? ** you still have autopublish turned on. <..>
é©åãªãµãã¹ã¯ãªãã·ã§ã³ãclient / home.jsãã¡ã€ã«ã«è¿œå ããŸãã
Meteor.subscribe('test');
ããã§ãããŒã¿ããã©ãŠã¶ã«åã³è¡šç€ºãããŸããããããå€æŽããæš©éã¯ãããŸããã
> Test.insert({name: 'Fifth', value: 5}) "BDgB258TovmqS7YbY" insert failed: Access denied
ã¬ã³ãŒããæåã«ããŒã«ã«ã³ã¬ã¯ã·ã§ã³ã«æ¿å
¥ããããã®èå¥åãè¿ããïŒãBDgB258TovmqS7YbYãïŒããã®ã¬ã³ãŒãããã©ãŠã¶ã«è¡šç€ºããããµãŒããŒãããšã©ãŒéç¥ãåä¿¡ãããããŒã«ã«ã³ã¬ã¯ã·ã§ã³ãžã®æ¿å
¥ãããŒã«ããã¯ãããããšã«æ³šæããŠãã ããã ãã©ãŠã¶ã§ã®è¡šç€ºã¯é
延è£æ£ã¡ã«ããºã ã«ãããã®ã§ãããèš±å¯/æåŠã«ãŒã«ã®ãã§ãã¯ã«ãããšã©ãŒã衚瀺ãããŸãïŒãããã«ã€ããŠã¯å°ãåŸã§ïŒã å®å
šã§ãªãããã±ãŒãžããªãå Žåãããã©ã«ãã®å€æŽã¯çŠæ¢ãããŠããŸãã
å
¬éæã«ãã£ãŒã«ããé衚瀺
ã³ã¬ã¯ã·ã§ã³ãå®å
šã«å
¬éããå¿
èŠã¯ãããŸããã ãããŸã§ããµãŒããŒã³ã¬ã¯ã·ã§ã³ã®ãã¹ãŠã®ãã£ãŒã«ãã衚瀺ãããŸããã ããšãã°ã_idãã£ãŒã«ããé衚瀺ã«ã§ããŸããããã«ãããã¯ã©ã€ã¢ã³ãåŽã§ããŒã¿ãå€æŽããããã®ã¬ã³ãŒãIDãæå®ããå¿
èŠãããããïŒIDã«ããããŒã¿å€æŽã®å¶éãåç
§ïŒããããMeteorã³ã¬ã¯ã·ã§ã³ã«å®è£
ããããªã©ãããŒã¿ãæäœããæ©èœãå¶éãããŸãããŠãŒã¶ãŒïŒä»¥äžãåç
§ïŒïŒ
Meteor.publish('test', function() { var projection = {_id: 0, value: 1}; return Test.find({}, {fields: projection} );
æ®å¿µãªããã_idãã£ãŒã«ãã¯ãã®æ¹æ³ã§é衚瀺ã«ããããšã¯ã§ããŸãããããããããµãŒããŒãšããŒã«ã«ã³ã¬ã¯ã·ã§ã³éã®å¯Ÿå¿ã確ç«ããããã«äœ¿çšãããŸãã çŸåšã®ããŒãžã§ã³ã§ã¯ãããã«ãããšã©ãŒãçºçãã以åã¯ç©ºã®ã³ã¬ã¯ã·ã§ã³ãè¿ãããŠããŸããã
ãã¡ããããã£ãŒã«ããé衚瀺ã«ãããšã転éãããããŒã¿ã®éã«ããã©ã¹ã®å¹æããããŸãã
æµæå£åº§ã·ã¹ãã
äžèšã®ãã¹ãŠã¯ãèš±å¯ãããŠããªããŠãŒã¶ãŒã«é©çšãããŸãã ãŸãããŠãŒã¶ãŒãæ¿èªãããå Žåãã©ã®ãããªæ©äŒã衚瀺ãããŸããïŒ
Meteorã¢ã«ãŠã³ãã·ã¹ãã ã®ãããžã§ã¯ããµããŒãã«è¿œå ããŸãã
$ mrt add accounts-base $ mrt add accounts-ui $ mrt add accounts-google
accounts-googleã«å ããŠãFacebookãTwitterãGithubãªã©ãå€æ°ã®æ¿èªãããã€ããŒåãã®å
¬åŒããã±ãŒãžããããŸãã éå
¬åŒããã±ãŒãžã¯ãVkontakteãªã©ã®ä»ã®ãããã€ããŒããµããŒãããŠããŸãã
home.htmlã§æ¢è£œã®ãŠãŒã¶ãŒèªèšŒãã¿ã³ãã³ãã¬ãŒãã䜿çšããŸãã
{{loginButtons}}
ãŠãŒã¶ãŒæ
å ±ã衚瀺ããcurrentUserïŒ
{{currentUser._id}} {{currentUser.profile.name}}
ãããŠãæåã«ãã¿ã³ãã¯ãªãã¯ãããšãã«è¡šç€ºãããã¹ããããã€ã¹ãããã®æé ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ãGoogleã«ç»é²ãããšãããã«ãŠãŒã¶ãŒãæ¿èªã§ããŸãã
FacebookããµããŒãããããã±ãŒãžãè¿œå ããŸãã
$ mrt add accounts-facebook
次ã«ã2çªç®ã®ãŠãŒã¶ãŒãç»é²ããŸãã
ã¢ã«ãŠã³ãã¯Meteor.usersã³ã¬ã¯ã·ã§ã³ã«ä¿åãããŸããããã©ãŠã¶ã§ã¢ã¯ã»ã¹ãããšããã§ã«2人ã®ç»é²ãŠãŒã¶ãŒãããã«ããããããã1ã€ã®ããã¥ã¡ã³ãã®ã¿ã衚瀺ãããŸãã
> Meteor.users.find().count() 1
å®éã«ã¯ãããã©ã«ãã§ïŒèªåçºè¡ããã±ãŒãžãç¡å¹ã«ãªã£ãŠããå Žå-ãã¹ãŠãå°ãè€éã«ãªããŸãïŒãã¯ã©ã€ã¢ã³ãã¯ãã®ã³ã¬ã¯ã·ã§ã³å
ã®èªåã®ããã¥ã¡ã³ãã®ãã£ãŒã«ãã®äžéšã®ã¿ã«ã¢ã¯ã»ã¹ã§ããŸãã
> Meteor.users.findOne()) {"_id":"8fLXBYpNGLqDwAahg","profile":{"name":"< >"}}
åãããã¥ã¡ã³ãã¯Meteor.userå€æ°ãä»ããŠå©çšã§ãããã®èå¥åã¯Meteor.userIdïŒïŒã§ãã
> Meteor.user() {"_id":"8fLXBYpNGLqDwAahg","profile":{"name":"< >"}}
察å¿ããé¢æ°ïŒãã«ããŒïŒHandlebars currentUserããããçŸåšã®ãŠãŒã¶ãŒã«é¢ããæ
å ±ã衚瀺ããŸãã
accounts-baseããã±ãŒãžã®ãœãŒã¹ã³ãŒããèŠããšãMeteor.usersã³ã¬ã¯ã·ã§ã³ããµãŒããŒäžã«æ¬¡ã®ããã«äœæãããŠããŸãã
Meteor.users = new Meteor.Collection("users", {_preventAutopublish: true});
ãããŠããã®ããã«å
¬éãããŸããïŒ
ãŠãŒã¶ãŒãæ¿èªãããŠããå Žåãthis.userIdã«ã¯èå¥åãå«ãŸããŸãããã®èå¥åã«ããããããã¡ã€ã«ãµãããã¥ã¡ã³ããããŒã¿ããŒã¹ããŠãŒã¶ãŒåãã£ãŒã«ããããã³é»åã¡ãŒã«ãµãããã¥ã¡ã³ãããè¿ãããŸãïŒæåŸã®2ã€ã¯ããã©ã«ãã§ã¯å
¥åãããŸããïŒã ãã以å€ã®å ŽåãããŒã¿ã¯å
¬éãããŸããã ããã¯ãããã©ã«ãã§ã¯ããã£ãŒã«ãã®äžéšã®ã¿ãšããŒã¿ããŒã¹ããã®èªåã®ããã¥ã¡ã³ãã®ã¿ãèš±å¯ãŠãŒã¶ãŒã«ã¢ã¯ã»ã¹å¯èœã§ããããšãæå³ããŸãã
ãœãŒã·ã£ã«ãããã¯ãŒã¯ãããŠãŒã¶ãŒã®Googleç»åãžã®ãªã³ã¯ã¯ãµãããã¥ã¡ã³ãservices.google.pictureã«ä¿åãããservices.facebook.idãšããèå¥åã䜿çšããŠFacebookããç»åã«ã¢ã¯ã»ã¹ã§ããŸãã ãããã«ã¢ã¯ã»ã¹ããã«ã¯ãããšãã°æ¬¡ã®ããã«è¿œå ã§å
¬éããå¿
èŠããããŸãïŒãµãŒããŒã«è¿œå / startup.jsïŒïŒ
Meteor.publish(null, function() { if (this.userId) { var projection = { 'services.google.picture': 1, 'services.facebook.id': 1, 'services.vk.photo': 1 }; return Meteor.users.find( { _id: this.userId }, { fields: projection } ); } else { return null; } });
ãããŠãç»åãžã®ãªã³ã¯ã¯home.htmlã«ãããŸãã
{{#if currentUser.services.facebook}} <img src="http://graph.facebook.com/{{currentUser.services.facebook.id}}/picture/?type=square"> {{else}}{{#if currentUser.services.google}} <img src={{currentUser.services.google.picture}}> {{else}}{{#if currentUser.services.vk}} <img src={{currentUser.services.vk.photo}}> {{/if}}{{/if}}{{/if}}
éžæãããã£ãŒã«ããã¯ã©ã€ã¢ã³ãã§äœ¿çšã§ããããã«ãªããŸããã
> Meteor.users.findOne() { "_id":"8fLXBYpNGLqDwAahg", "profile": { "name":"< >" }, "services": { "facebook": { "id": "< Facebook>" } } }
ãã£ãŒã«ããæ瀺çã«æå®ãã代ããã«ãprojection = {}ãèšå®ããŠãŠãŒã¶ãŒããã¥ã¡ã³ãå
šäœãå
¬éããããprojection = {servicesïŒ1}ãèšå®ããŠãµãŒãã¹ãµãããã¥ã¡ã³ããå
¬éã§ããŸãã ãã ãããã®å Žåãã¯ã©ã€ã¢ã³ãã¯æããã«accessTokenãloginTokensãªã©ã®è¿œå ããŒã¿ãåãåããŸãã
ä»ã®ãŠãŒã¶ãŒã«é¢ããæ
å ±ã衚瀺ããå¿
èŠãããå Žåãã³ã¬ã¯ã·ã§ã³å
ã®ãã¹ãŠã®ããã¥ã¡ã³ãã®éžæãããã£ãŒã«ããå
¬éã§ããŸããããšãã°ãæ¢åã®å
¬éã«ãã1ã€è¿œå ã§ããŸãã
Meteor.publish(null, function() { var projection = { 'profile.name': 1 }; return Meteor.users.find( { }, { fields: projection } ); });
ãã®çµæããã¹ãŠã®ãããªã±ãŒã·ã§ã³ãçµ±åãããçŸåšã§ã¯ãèš±å¯ãããŠããªããããªã±ãŒã·ã§ã³ãå«ããã¹ãŠã®ãŠãŒã¶ãŒã«ãã¹ãŠã®ç»é²ãŠãŒã¶ãŒã®ååã衚瀺ãããçŸåšã®ãŠãŒã¶ãŒã«ã¯ããã¥ã¡ã³ãã®è¿œå ãã£ãŒã«ãã衚瀺ãããŸãã
Meteor.users.find().fetch() [ { "_id":"8fLXBYpNGLqDwAahg", "profile": { "name":"< >" } }, { "_id":"kL7Fkuk29ci4vz8q4", "profile": { "name":"< >" }, "services": { "google":{ "picture":"< >" } } } ]