Feathers.js -> 更改 after create 挂钩的布局
Feathers.js -> Change the layout of the after create hook
我已经设置 nuxt.js,正在转换我的羽毛项目。到目前为止它正在运行。通过 postman 添加的内容出现在我的浏览器网页上。有一点不同,即当我 post 推入与初始数组不匹配的整个数据数组时。
样本
{ "message_txt": "Hello todays2" }
{ "id": 17, "message_txt": "Hello YESd", "updated_at": "2017-03-25T11:15:44.000Z", "created_at": "2017-03-25T11:15:44.000Z" }
所以第一行是如何配置返回数据的。这是在我的挂钩文件中设置的:
'use strict';
const globalHooks = require('../../../hooks/index');
const hooks = require('feathers-hooks');
exports.before = {
all: [],
find: [
getRelatedInfo()
],
get: [
getRelatedInfo()
],
create: [],
update: [],
patch: [],
remove: []
};
exports.after = {
all: [],
find: [],
get: [],
create: [
getRelatedInfo()
],
update: [],
patch: [],
remove: []
};
function getRelatedInfo() {
return function (hook) {
hook.params.sequelize = {
attributes: [
'message_txt'
],
order: [
['created_at', 'DESC']
]
};
return Promise.resolve(hook);
};
}
目前,我的客户端用这部分加载数据:
<template>
<div>
idnex.vue
<ul>
<li v-for="message in messages">
{{ message }}
</li>
</ul>
</div>
</template>
<script>
import axios from 'axios';
import feathers from 'feathers/client';
import socketio from 'feathers-socketio/client';
import io from 'socket.io-client';
export default {
data: function() {
return {
messages: []
}
},
mounted: function() {
axios.get('http://localhost:3001/messages')
.then((response) => {
this.messages = response.data.data
});
const app = feathers().configure(socketio(io('http://localhost:3001')));
app.service('messages').on('created', (message) => {
this.messages.push(message);
})
}
}
</script>
问题
我需要做什么来确保 "this.messages.push(message)" 在相同的结构中,所以只有 "message_txt"。我尝试将钩子中的函数添加到 "after create" 但它不起作用。
求解
好的,所以更改客户端的组件文件可以访问服务、模型和挂钩以及客户端中配置的服务的其他内容。 'service.find()' 就在那里,因为我从一个更复杂的服务中复制了它,在该服务中,查找挂钩中有更多列,而我只想要特定的列。
<template>
<div>
idnex.vue
todo: eagle.js slideshow
todo: first info
<ul>
<li v-for="message in listMessages">
{{ message }}
</li>
</ul>
</div>
</template>
<script>
import feathers from 'feathers/client';
import socketio from 'feathers-socketio/client';
import hooks from 'feathers-hooks';
import io from 'socket.io-client';
import * as process from "../nuxt.config";
const vttSocket = io(process.env.backendUrl);
const vttFeathers = feathers()
.configure(socketio(vttSocket))
.configure(hooks());
const serviceMessage = vttFeathers.service('messages');
export default {
layout: 'default',
data: function() {
return {
listMessages: []
}
},
mounted: function() {
//TODO change the message layout to the correct layout
serviceMessage.find({
query: {
$sort: {
created_at: 1
},
$select: [
'message_txt'
]
}
}).then(page => {
this.listMessages = page.data;
});
serviceMessage.on('created', (serviceMessage) => {
this.listMessages.push(serviceMessage);
});
}
}
</script>
使用此代码,页面仍会加载,但 'this.listMessages' 仍会提供 created_at 之类的内容。此外,当我没有 nuxt 和 client/server 情况(客户端和服务器是一个)时,我不需要 'on created' 来实时更新显示的列表。我仍然需要实时更新的线路。
重要说明,我刚刚注意到在 postman 中您还可以看到整个记录信息,而不是与 GET
相同的信息
快到了。我想出了在我的钩子文件中做什么
exports.after = {
all: [],
find: [],
get: [],
create: [
hooks.remove('createdAt'),
hooks.remove('updatedAt')
],
update: [],
patch: [],
remove: []
};
在这个文件中我有上面的部分。如果我将删除中的列更改为 'custom' 列(在模型中),它将起作用。这两个不行
this.messages.push(message.message_txt); ?...
啊,我想我现在明白你真正在问什么了。出于安全原因,只会在客户端和服务器之间传递 params.query。如果您想根据查询参数设置 params.sequelize,您必须对其进行清理并将其映射到一个挂钩中:
app.service('myservice').before(function(hook) {
const query = hook.params.query;
hook.params.sequelize = {};
if(query.someSequelizeParameter) {
hook.params.sequelize.myParameter = sanitize(query.someSequelizeParameter);
delete query.someSequelizeParameter;
}
});
其他选项是只使用 Feathers 挂钩。另外,这不是你问题的一部分,但如果你无论如何都在使用套接字,你真的不需要 Axios 和通过方法更新的 REST 东西,你可以将服务绑定到套接字并使用 RxJS 之类的东西来流式传输所有实时更新。您正在做的很好并且可以工作,但是需要维护更多的代码。
我已经设置 nuxt.js,正在转换我的羽毛项目。到目前为止它正在运行。通过 postman 添加的内容出现在我的浏览器网页上。有一点不同,即当我 post 推入与初始数组不匹配的整个数据数组时。
样本
{ "message_txt": "Hello todays2" }
{ "id": 17, "message_txt": "Hello YESd", "updated_at": "2017-03-25T11:15:44.000Z", "created_at": "2017-03-25T11:15:44.000Z" }
所以第一行是如何配置返回数据的。这是在我的挂钩文件中设置的:
'use strict';
const globalHooks = require('../../../hooks/index');
const hooks = require('feathers-hooks');
exports.before = {
all: [],
find: [
getRelatedInfo()
],
get: [
getRelatedInfo()
],
create: [],
update: [],
patch: [],
remove: []
};
exports.after = {
all: [],
find: [],
get: [],
create: [
getRelatedInfo()
],
update: [],
patch: [],
remove: []
};
function getRelatedInfo() {
return function (hook) {
hook.params.sequelize = {
attributes: [
'message_txt'
],
order: [
['created_at', 'DESC']
]
};
return Promise.resolve(hook);
};
}
目前,我的客户端用这部分加载数据:
<template>
<div>
idnex.vue
<ul>
<li v-for="message in messages">
{{ message }}
</li>
</ul>
</div>
</template>
<script>
import axios from 'axios';
import feathers from 'feathers/client';
import socketio from 'feathers-socketio/client';
import io from 'socket.io-client';
export default {
data: function() {
return {
messages: []
}
},
mounted: function() {
axios.get('http://localhost:3001/messages')
.then((response) => {
this.messages = response.data.data
});
const app = feathers().configure(socketio(io('http://localhost:3001')));
app.service('messages').on('created', (message) => {
this.messages.push(message);
})
}
}
</script>
问题 我需要做什么来确保 "this.messages.push(message)" 在相同的结构中,所以只有 "message_txt"。我尝试将钩子中的函数添加到 "after create" 但它不起作用。
求解
好的,所以更改客户端的组件文件可以访问服务、模型和挂钩以及客户端中配置的服务的其他内容。 'service.find()' 就在那里,因为我从一个更复杂的服务中复制了它,在该服务中,查找挂钩中有更多列,而我只想要特定的列。
<template>
<div>
idnex.vue
todo: eagle.js slideshow
todo: first info
<ul>
<li v-for="message in listMessages">
{{ message }}
</li>
</ul>
</div>
</template>
<script>
import feathers from 'feathers/client';
import socketio from 'feathers-socketio/client';
import hooks from 'feathers-hooks';
import io from 'socket.io-client';
import * as process from "../nuxt.config";
const vttSocket = io(process.env.backendUrl);
const vttFeathers = feathers()
.configure(socketio(vttSocket))
.configure(hooks());
const serviceMessage = vttFeathers.service('messages');
export default {
layout: 'default',
data: function() {
return {
listMessages: []
}
},
mounted: function() {
//TODO change the message layout to the correct layout
serviceMessage.find({
query: {
$sort: {
created_at: 1
},
$select: [
'message_txt'
]
}
}).then(page => {
this.listMessages = page.data;
});
serviceMessage.on('created', (serviceMessage) => {
this.listMessages.push(serviceMessage);
});
}
}
</script>
使用此代码,页面仍会加载,但 'this.listMessages' 仍会提供 created_at 之类的内容。此外,当我没有 nuxt 和 client/server 情况(客户端和服务器是一个)时,我不需要 'on created' 来实时更新显示的列表。我仍然需要实时更新的线路。
重要说明,我刚刚注意到在 postman 中您还可以看到整个记录信息,而不是与 GET
相同的信息快到了。我想出了在我的钩子文件中做什么
exports.after = {
all: [],
find: [],
get: [],
create: [
hooks.remove('createdAt'),
hooks.remove('updatedAt')
],
update: [],
patch: [],
remove: []
};
在这个文件中我有上面的部分。如果我将删除中的列更改为 'custom' 列(在模型中),它将起作用。这两个不行
this.messages.push(message.message_txt); ?...
啊,我想我现在明白你真正在问什么了。出于安全原因,只会在客户端和服务器之间传递 params.query。如果您想根据查询参数设置 params.sequelize,您必须对其进行清理并将其映射到一个挂钩中:
app.service('myservice').before(function(hook) {
const query = hook.params.query;
hook.params.sequelize = {};
if(query.someSequelizeParameter) {
hook.params.sequelize.myParameter = sanitize(query.someSequelizeParameter);
delete query.someSequelizeParameter;
}
});
其他选项是只使用 Feathers 挂钩。另外,这不是你问题的一部分,但如果你无论如何都在使用套接字,你真的不需要 Axios 和通过方法更新的 REST 东西,你可以将服务绑定到套接字并使用 RxJS 之类的东西来流式传输所有实时更新。您正在做的很好并且可以工作,但是需要维护更多的代码。