2017-03-25 4 views
0

私は羽根プロジェクトを変換してnuxt.jsをセットアップしました。これまでは機能しています。私のブラウザのウェブページに郵便配達員を介して何かが追加されました。違いがあります。つまり、データ配列全体が初期配列と一致しないものを投稿したときです。Feathers.js - > After createフックのレイアウトを変更

サンプル

{ "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_txt "だけです。フックの関数を「作成後」に追加しようとしましたが、機能しません。クライアントで構成されたように、クライアントの構成ファイルを変更し、

がわかりまし解決

サービス、モデル、およびフックやサービスの他に何にアクセスできます。 '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とクライアント/サーバの状況(クライアントとサーバが1つの場合)を持たないときは、リアルタイムで更新されるように表示されたリストに対して '作成済み'は必要ありませんでした。私はリアルタイムアップデートのためのラインをまだ持っている必要があります。

重要な注意、私は郵便配達であなたもそうほとんどがGET

のようにレコード全体の情報ではなく、同じ情報を見ることに気づきました。私はフックファイルで何をすべきか考え出しました

exports.after = { 
    all: [], 
    find: [], 
    get: [], 
    create: [ 
     hooks.remove('createdAt'), 
     hooks.remove('updatedAt') 
    ], 
    update: [], 
    patch: [], 
    remove: [] 
}; 

私は上記のセクションを持っています。削除の列を 'カスタム'の列に変更すると(モデルにあります)、それは機能します。これらの2つは動作しません。

答えて

0

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; 
    } 
}); 

他のオプションだけではなく、羽フックを使用することです。また、あなたの質問の一部ではありませんが、とにかくソケットを使用しているのであれば、実際にAxiosとRESTをメソッドで更新する必要はありません。サービスをソケットに結びつけ、RxJSのようなものをすべてストリームすることができますリアルタイムで更新されます。あなたがやっていることはうまくいき、動くでしょうが、維持するコードがさらに増えます。

+0

これはうまくいくでしょう:「こんにちは」(例えば)。だから、まだ初期のロードとは異なるフォーマットです。私は何とか 'getRelatedInfo()'で定義されたレイアウトに等しいメッセージを返すことを望んでいました。これは小さな例ですが、私はより多くの列を持つサービスを持っており、新しい列を応答に追加したい場合は、変更する必要があるだけです。あなたが提案する方法は動作しますが、ここでもそれを変更する必要があります。 – Edgar

+0

ありがとうございます。これは分かります。私はそのプロジェクトを持っていますが、私のクライアントとサーバーは、同じ「サブプロジェクト」では別々の場所にあります。しかし、私がそれを再び機能させることができるかどうかがわかりますが、私は今、非常にクリアなyoutubeビデオから来ているこのアイデアのために可能かもしれないことを知らなかった。 – Edgar

関連する問題