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 之类的东西来流式传输所有实时更新。您正在做的很好并且可以工作,但是需要维护更多的代码。