メモ帳

やったこととかちまちまと書く 需要のない記事を生成している

MeteorのUsersCollectionのpublishの仕方

docs.meteor.com

つまづいたところ

autopublishを消すとコレクションが同期されなくなるので当然

Meteor.users.find().fetch();

が本来の働きをしてくれない(バージョン1.4.2.3で動かして見たところ自分のデータしか返さない)

Meteor.publish(name,function() {
  return Meteor.users.find();
}

をしたら同期されるはずだがusersコレクションの名前がわかならいので期待した動作をしてくれない。

解決策

Meteor.publish(null,function(){
  return Meteor.users.find();
});

あとはfieldsオプションを与えるなどしてお好みのデータを生成するだけ

参考サイト

stackoverflow.com

ClojureScriptでNode.jsを動かす

kwnktks0515.hatenablog.comの続き

動かしてみたコード

Clojurescript / node.js basic examples · GitHub

追加で

(nodejs/enable-util-print!)

を入れないと動かないっぽい
参考:Quick Start · clojure/clojurescript Wiki · GitHub

非ビルドツール編

build.clj

(require 'cljs.build.api)
(cljs.build.api/build "src"
  {:main "helloserver"
   :output-to "out/main.js"
   :output-dir "out"
   :target :nodejs})

Leiningen編

project.clj

(defproject cljs-test "0.1.0-SNAPSHOT"
  :plugins [[lein-cljsbuild "1.1.4"]]
  :dependencies [ [org.clojure/clojure "1.8.0"]
                  [org.clojure/clojurescript "1.8.51"]]
  :cljsbuild {
    :builds [{
        :source-paths ["src"]
        :compiler {
          :main "helloserver"
          :output-to "out/main.js"
          :output-dir "out"
          :target :nodejs
          :optimizations :none
          :pretty-print true}}]})

共通部分

node out/main.js

して http://127.0.0.1:1337/ にアクセスしたらHello Worldって出てくる。

Meteorでチャットシステム構築

Meteorでチャットシステムを構築してみた

client.js

import { Meteor } from 'meteor/meteor'
import { Mongo } from 'meteor/mongo'

Messages = new Mongo.Collection('messages');

Template.Chat.helpers({
  messages: Messages.find({},{sort:{date:-1}})
});

Template.Chat.events({
  'submit #talk': event => {
    event.preventDefault();
    if(event.target.mes.value != "") {
      Messages.insert({
        username: event.target.name.value,
        mes_text: event.target.mes.value
      },err => {
        if(err) {
          console.log(err);
        } else {
          event.target.mes.value = "";
          console.log("add");
        }
      })
    }
  }
});

server.js

import { Meteor } from 'meteor/meteor';
import { Mongo } from 'meteor/mongo';

Messages = new Mongo.Collection('messages');

Meteor.startup(() => {
});

main.html

<head>
    <title>Chat</title>
</head>
<body>
    
</body>

<template name="Chat">
    <h1>チャット</h1> 
    <form id="talk">
        <p>名前:<input type="text" name="name"></p>
        <p>メッセージ:<input type="text" name="mes"></p>
        <input type="submit" value="送信">
    </form>
    {{#each messages}}
        <div>
            <p>{{username}} : {{mes_text}}</p>
        </div>
    {{/each}}
</template>

client用とserver用のscriptを分けた場合、別々に宣言する必要があるらしい。client側だけで宣言したらserver側には保存されないっぽい。同じファイルに記述した場合、一番上にでも宣言しておけば問題はなさそう。

参考

qiita.com
tech-sketch.jp
Introducing Meteor API Docs | Meteor API Docs
一週間以上前に書いたコードなのでmeteorのどこのドキュメント見たかわからなくなった・・・・
DBの使い方とtemplateの使い方を把握していたらすぐ理解できると思う。