Chat App Tut:populate()的目的?

时间:2017-05-01 19:19:33

标签: javascript feathersjs

我正在学习FeathersJS,到目前为止,似乎我希望Meteor的所有内容。保持伟大的工作!

现在我正在研究Chat App tutorial但是遇到了一些困惑。我不太明白教程的this section中发生了什么,特别是 messages.hooks.js 中的populate挂钩:

'use strict';

const { authenticate } = require('feathers-authentication').hooks;
const { populate } = require('feathers-hooks-common');
const processMessage = require('../../hooks/process-message');

module.exports = {
    before: {
        all: [ authenticate('jwt') ],
        find: [],
        get: [],
        create: [ processMessage() ],
        update: [ processMessage() ],
        patch: [ processMessage() ],
        remove: []
    },

    after: {
        all: [
            // What's the purpose of this ?
            populate({
                schema: {
                    include: [{
                        service: 'users',
                        nameAs: 'user',
                        parentField: 'userId',
                        childField: '_id'
                    }]
                }
            })
        ],
        find: [],
        get: [],
        create: [],
        update: [],
        patch: [],
        remove: []
    },

    error: {
        all: [],
        find: [],
        get: [],
        create: [],
        update: [],
        patch: [],
        remove: []
    }
};

这是 process-message.js

'use strict';

// Use this hook to manipulate incoming or outgoing data.
// For more information on hooks see: http://docs.feathersjs.com/api/hooks.html

module.exports = function() {
    return function(hook) {
        // The authenticated user
        const user = hook.params.user;
        // The actual message text
        const text = hook.data.text
        // Messages can't be longer than 400 characters
        .substring(0, 400)
        // Do some basic HTML escaping
        .replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');

        // Override the original data
        hook.data = {
            text,
            // Set the user id
            userId: user._id,
            // Add the current time via `getTime`
            createdAt: new Date().getTime()
        };

        // Hooks can either return nothing or a promise
        // that resolves with the `hook` object for asynchronous operations
        return Promise.resolve(hook);
    };
};

我了解在消息服务上执行createupdatepatch之前,数据会发送到processMessage(),以清理数据并添加用户ID。

问题

  1. processMessage()之后,数据是否立即写入数据库?
  2. 将数据写入数据库后,执行after挂钩,对吗?
  3. 那么populate钩子的目的是什么?
  4. 谢谢:)

2 个答案:

答案 0 :(得分:1)

更好地了解羽毛上的钩子和其他很酷的东西。做一些基本的日志是很好的。无论如何这里是流程。

客户 - &gt;在ALL挂钩之前 - &gt;其他之前(创建,更新,......) - &gt;数据库 - &gt;错误钩子(注意:只有在前面的步骤中有错误) - &gt;在所有钩子之后 - &gt;其他之后(创建,更新,......) - &gt;过滤器 - &gt; CLIENT

对于populate钩子,它与db中的populate具有相同的用途。 Feathers为你做,而不是你做填充查询。

根据您的示例,您希望在您的架构中有类似的内容;

{
  ...,
  userId : [{ type: <theType>, ref: 'users' }] 
}

您要添加另一个名为user的字段,然后使用users服务中的数据填充该字段,并将其_iduserId匹配。

答案 1 :(得分:0)

填充钩是由羽毛钩共用模块提供的钩子之一。它的功能是在加入数据库中的各个表之后提供数据。由于每个表都由单个服务表示,因此您可以考虑在调用填充挂钩的服务与另一个服务之间发生连接。 因此,在下面的代码中,一个schema对象被传递给populate hook:

populate({
          schema: {
            include: [{
                  service: 'users',
                  nameAs: 'user',
                  parentField: 'userId',
                  childField: '_id'
            }]
          }
})

它基本上告诉钩子包含来自'用户'服务的数据。 它还告诉它将附加数据命名为“用户”。 它表示连接的parentField(即具有挂钩的服务中的字段(在您的情况下是消息服务)是'userId'。 它表示连接的childField(即'用户'服务中的字段是'_id'。

收到数据后,它将包含来自messages表的所有字段以及来自users表的关键用户和键值对的附加对象。