7

meteorで条件付きでクライアントにデータを送信する方法を見つけようとしています。私には 2 つのユーザー タイプがあり、ユーザーのタイプに応じて、クライアント上のインターフェイスが異なります (したがって、必要なデータは異なります)。

ユーザーのタイプがcounselorまたはであるとしましょうstudent。すべてのユーザードキュメントには、role: 'counselor'またはのようなものがありrole: 'student'ます。

生徒には や などの生徒固有の情報がsessionsRemainingありcounselor、カウンセラーには などの情報がありますpricePerSession

Meteor.user()クライアント側に必要な情報があり、余分なものがないことを確認するにはどうすればよいですか? 学生としてログインしている場合はとMeteor.user()を含める必要がありますが、カウンセラーとしてログインしている場合は含めないでください。私が探しているのは、流星用語での条件付きの出版物と購読だと思います。sessionsRemainingcounselor

4

3 に答える 3

13

フィールドオプションを使用して、Mongoクエリから必要なフィールドのみを返します。

Meteor.publish("extraUserData", function () {
  var user = Meteor.users.findOne(this.userId);
  var fields;

  if (user && user.role === 'counselor')
    fields = {pricePerSession: 1};
  else if (user && user.role === 'student')
    fields = {counselor: 1, sessionsRemaining: 1};

  // even though we want one object, use `find` to return a *cursor*
  return Meteor.users.find({_id: this.userId}, {fields: fields});
});

そして、クライアントで電話するだけです

Meteor.subscribe('extraUserData');

Meteorではサブスクリプションが重複する可能性があります。したがって、このアプローチの優れている点は、追加のフィールドをクライアントに送信する公開機能が、ユーザーのメールアドレスやプロファイルなどの基本的なフィールドを送信するMeteorの舞台裏の公開機能と連携して機能することです。クライアントでは、コレクション内のドキュメントMeteor.usersは2セットのフィールドの和集合になります。

于 2012-12-28T19:56:10.163 に答える
3

デフォルトでは、Meteor ユーザーは基本情報のみで公開されるため、Meteor.publish を使用してこれらのフィールドを手動でクライアントに追加する必要があります。ありがたいことに、公開されている Meteor ドキュメントには、これを行う方法を示す例があります。

// server: publish the rooms collection, minus secret info.
Meteor.publish("rooms", function () {
  return Rooms.find({}, {fields: {secretInfo: 0}});
});

// ... and publish secret info for rooms where the logged-in user
// is an admin. If the client subscribes to both streams, the records
// are merged together into the same documents in the Rooms collection.
Meteor.publish("adminSecretInfo", function () {
  return Rooms.find({admin: this.userId}, {fields: {secretInfo: 1}});
});

基本的に、条件が満たされたときに特定の情報をクライアントに返し、そうでないときに他の情報を返すチャネルを公開します。次に、クライアントでそのチャネルをサブスクライブします。

あなたの場合、おそらくサーバーに次のようなものが必要です。

Meteor.publish("studentInfo", function() {
  var user = Meteor.users.findOne(this.userId);

  if (user && user.type === "student")
    return Users.find({_id: this.userId}, {fields: {sessionsRemaining: 1, counselor: 1}});
  else if (user && user.type === "counselor")
    return Users.find({_id: this.userId}, {fields: {pricePerSession: 1}});
});

次に、クライアントでサブスクライブします。

Meteor.subscribe("studentInfo");
于 2012-12-28T19:50:26.927 に答える
0

Meteor.users は他の Meteor コレクションと同様のコレクションであるため、公開されているコンテンツを他の Meteor コレクションと同様に実際に調整できます。

Meteor.publish("users", function () {
    //this.userId is available to reference the logged in user 
    //inside publish functions
    var _role = Meteor.users.findOne({_id: this.userId}).role;
    switch(_role) {
        case "counselor":
            return Meteor.users.find({}, {fields: { sessionRemaining: 0, counselor: 0 }});
        default: //student
            return Meteor.users.find({}, {fields: { counselorSpecific: 0 }});
    }
});

次に、クライアントで次のようにします。

Meteor.subscribe("users");

したがって、Meteor.user()ログインしたユーザーのロールに基づいて自動的に切り捨てられます。

完全な解決策は次のとおりです。

if (Meteor.isServer) {
    Meteor.publish("users", function () {
        //this.userId is available to reference the logged in user 
        //inside publish functions
        var _role = Meteor.users.findOne({ _id: this.userId }).role;
        console.log("userid: " + this.userId);
        console.log("getting role: " + _role);
        switch (_role) {
            case "counselor":
                return Meteor.users.find({}, { fields: { sessionRemaining: 0, counselor: 0 } });
            default: //student
                return Meteor.users.find({}, { fields: { counselorSpecific: 0 } });
        }
    });

    Accounts.onCreateUser(function (options, user) {
        //assign the base role
        user.role = 'counselor' //change to 'student' for student data

        //student specific
        user.sessionRemaining = 100;
        user.counselor = 'Sam Brown';

        //counselor specific
        user.counselorSpecific = { studentsServed: 100 };

        return user;
    });
}

if (Meteor.isClient) {
    Meteor.subscribe("users");

    Template.userDetails.userDump = function () {
        if (Meteor.user()) {
            var _val = "USER ROLE IS " + Meteor.user().role + " | counselorSpecific: " + JSON.stringify(Meteor.user().counselorSpecific) + " | sessionRemaining: " + Meteor.user().sessionRemaining + " | counselor: " + Meteor.user().counselor;
            return _val;
        } else {
            return "NOT LOGGED IN";
        }
    };
}

そしてHTML:

<body>
    <div style="padding:10px;">
        {{loginButtons}}
    </div>

    {{> home}}
</body>

<template name="home">
    <h1>User Details</h1>
    {{> userDetails}}
</template>

<template name="userDetails">
   DUMP:
   {{userDump}}
</template>
于 2012-12-28T20:19:50.060 に答える