我正在学习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,'&').replace(/</g,'<').replace(/>/g,'>');
// 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);
};
};
我了解在消息服务上执行create
,update
或patch
之前,数据会发送到processMessage()
,以清理数据并添加用户ID。
问题:
processMessage()
之后,数据是否立即写入数据库?after
挂钩,对吗?populate
钩子的目的是什么?谢谢:)
答案 0 :(得分:1)
更好地了解羽毛上的钩子和其他很酷的东西。做一些基本的日志是很好的。无论如何这里是流程。
客户 - &gt;在ALL挂钩之前 - &gt;其他之前(创建,更新,......) - &gt;数据库 - &gt;错误钩子(注意:只有在前面的步骤中有错误) - &gt;在所有钩子之后 - &gt;其他之后(创建,更新,......) - &gt;过滤器 - &gt; CLIENT
对于populate钩子,它与db中的populate
具有相同的用途。 Feathers为你做,而不是你做填充查询。
根据您的示例,您希望在您的架构中有类似的内容;
{
...,
userId : [{ type: <theType>, ref: 'users' }]
}
您要添加另一个名为user
的字段,然后使用users
服务中的数据填充该字段,并将其_id
与userId
匹配。
答案 1 :(得分:0)
填充钩是由羽毛钩共用模块提供的钩子之一。它的功能是在加入数据库中的各个表之后提供数据。由于每个表都由单个服务表示,因此您可以考虑在调用填充挂钩的服务与另一个服务之间发生连接。 因此,在下面的代码中,一个schema对象被传递给populate hook:
populate({
schema: {
include: [{
service: 'users',
nameAs: 'user',
parentField: 'userId',
childField: '_id'
}]
}
})
它基本上告诉钩子包含来自'用户'服务的数据。 它还告诉它将附加数据命名为“用户”。 它表示连接的parentField(即具有挂钩的服务中的字段(在您的情况下是消息服务)是'userId'。 它表示连接的childField(即'用户'服务中的字段是'_id'。
收到数据后,它将包含来自messages表的所有字段以及来自users表的关键用户和键值对的附加对象。