2017-10-08 4 views
0

tmijs libraryのチャットイベントを聞いて、!overlayチャットでコードを実行したい。私はそのメッセージを取得するときに達成したいことは次のとおりです。Expressを使用してPUTルート後にコードが実行されない

  • ユーザーがユーザー
  • トリガソケットイベントからの私の反応のアプリ
  • に十分な通貨
  • 控除の通貨を持っている場合、ユーザー
  • チェックを取得します

最後の箇条書きまではすべてがうまくいくようです。私の端末では、私のユーザが通貨(私のコードでは「kluiten」と呼ばれる)を差し引いていることが示されていますが、それ以降のすべてのコードは実行されません。

require('dotenv').config(); 
const PORT = process.env.PORT || 9000; 

class TwitchAPI { 
    constructor({io}) { 
    this.io = io; 
    this.client = new tmi.client(options); 

    this.client.connect(); 

    this.handleOverlayRequest = this.handleOverlayRequest.bind(this); 
    this.handleChatMessage = this.handleChatMessage.bind(this); 

    this.client.on('chat', this.handleChatMessage); 
    } 

    handleChatMessage (channel, userstate, message) { 
    if(message === '!overlay') this.handleOverlayRequest(channel, userstate); 
    } 

    async handleOverlayRequest (channel, userstate) { 
    const requiredKluiten = 5; 
    const rawFoundUser = await fetch(`http://localhost:${PORT}/api/users/${userstate.username}`); 
    const foundUser = await rawFoundUser.json(); 

    if(foundUser.instakluiten >= requiredKluiten) { 
     this.client.action(channel, `${userstate[`display-name`]}, you've got enough instakluiten for this.`); 

     const method = `PUT`; 
     const payload = { 'requiredKluiten': requiredKluiten }; 
     const body = JSON.stringify(payload); 
     const headers = { 'Content-Type': `application/json; charset=utf-8` }; 

     const result = await fetch(`http://localhost:${PORT}/api/users/${userstate.username}/decrementKluiten`, { method, body, headers }); 
     console.log(result); 
    } 
    } 
} 

module.exports = TwitchAPI; 

私は、Expressルータがあります。

const express = require('express'); 
const userController = require('../controllers/userController'); 

const router = express.Router(); 

router.route('/users/:username/decrementKluiten').put(userController.decrementKluiten); 
router.route('/users/:username').get(userController.getUser); 
router.route('/overview').get(userController.getOverview); 

module.exports = router; 

通貨が差し引かれますを確認します。私が今立ち往生しているのは、すべてのことが起こった後、フェッチした後でもうコードを実行できないということです。私は私が私のルートで約束を解決することによって、コードを実行することができることかかわらたが、それは本当に汚い感じていると私の分割ファイルを台無しに:

router.route('/users/:username/decrementKluiten').put((req, res) => { 
userController.decrementKluiten(req, res).then(x => { 
    console.log(x); 
}); 
}); 

起こると、まだ実行するために私のPUTを待つ方法はありますコードはそれの後に?これは私だけにしようと多くのコードは、この記事の関連部分を含んで含まれているため

userController.js

const {findChattersPerRole, getUserByUsername, decrementKluiten} = require('../actions'); 
const find = require(`lodash/find`); 
const fetch = require(`isomorphic-fetch`); 
const parseJSON = response => response.json(); 

module.exports = { 
    getUser: (req, res) => { 
    const username = req.params.username; 
    findChattersPerRole() 
     .then(chattersPerRole => { 
     const wantedUser = find(chattersPerRole, { username }); 
     getUserByUsername(wantedUser.username) 
      .then(foundUser => { 
      if (foundUser) { 
       res.send(foundUser); 
      } else { 
       res.send(`No user has been found`); 
      } 
      }); 
     }); 
    }, 
    getOverview: (req, res) => { 
    fetch(`https://tmi.twitch.tv/group/user/instak/chatters`) 
    .then(parseJSON) 
    .then(r => { 
     return res.json(r); 
    }).catch(err => { 
     console.log(err); 
    }); 
    }, 
    decrementKluiten: (req, res) => { 
    decrementKluiten(req.params.username, req.body.requiredKluiten); 
    } 
} 

EDITは

をactions.js、データベース呼び出しはSequelize.jsを使用して行われます。

const decrementKluiten = (username, requiredKluiten) => { 
    return global.db.Viewer.findOne({ 
    where: { username } 
    }).then(user => { 
    return user.decrement({ instakluiten: requiredKluiten }); 
    }); 
}; 

module.exports = { 
    decrementKluiten 
}; 
+0

は素晴らしいことです。 – Svenskunganka

+0

@Svenskunganka最も関連性の高い部分を追加しました。 'userController.js'ファイル、エクスポート' decrementKluiten'方法で – Kevin

+1

、あなたは 'decrementKluiten(req.params.username、req.body.requiredKluiten).then(()=> res.sendStatus(とそのコードを交換する場合200))。catch(()=> res.sendStatus(500)) 'のように動作しますか?私はおそらくこれについてチャットを開くことができるのだろうかと思っています。デバッグをしなければならないかもしれないと思っています。 – Svenskunganka

答えて

1

/users/:username/decrementKluitenルートのHTTP要求に応答しない可能性があります。あなたはすでにあなたのコードの一部でasync機能を使用するので、もう少し読みやすいコードを作るために

decrementKluiten: (req, res) => { 
    decrementKluiten(req.params.username, req.body.requiredKluiten) 
    .then(() => res.sendStatus(200)) 
    .catch(() => res.sendStatus(500)); 
} 

いくつかの無関係なポインタ:この問題を解決するには、これにuserController.js -fileでエクスポートdecrementKluiten方法を変更他の部分では、Promisesと直接対話します。

userController.jsのエクスポート一部がasyncの機能を利用できます。

module.exports = { 
    getUser: async (req, res) => { 
    try { 
     const username = req.params.username; 
     let chattersPerRole = await findChattersPerRole(); 
     let wantedUser = find(chattersPerRole, { username }); 
     let foundUser = await getUserByUsername(watnerUser.username); 
     if (foundUser) { 
     res.status(200).send(foundUser); 
     } else { 
     res.status(404).send('No user has been found'); 
     } 
    } catch (e) { 
     res.sendStatus(500); 
    } 
    }, 
    getOverview: async (req, res) => { 
    try { 
     let r = (await fetch('https://tmi.twitch.tv/group/user/instak/chatters')).json(); 
     res.json(r); 
    } catch (e) { 
     res.sendStatus(500); 
    } 
    }, 
    decrementKluiten: async (req, res) => { 
    try { 
     await decrementKluiten(req.params.username, req.body.requiredKluiten); 
     res.sendStatus(200); 
    } catch (e) { 
     res.sendStatus(500); 
    } 
    } 
} 

を私はまた、エラー処理を追加した何かがうまくいかない場合には、サーバが500 Internal Server Errorステータスコードで応答します。私はあなたがconst foundUser = await fetch('...').json()を行うことを試みたと仮定し

const rawFoundUser = await fetch(`http://localhost:${PORT}/api/users/${userstate.username}`); 
const foundUser = await rawFoundUser.json(); 

:あなたのTwitchAPIクラスに次の行から判断する

。これはエラーになりますが、あなたはこのように、括弧でのawait式をラップする場合は、同じ行に再調整値のメソッドとプロパティを呼び出すことができます。

const foundUser = await (await fetch('...')).json()` 

そのメソッドがあることの約束(すなわちを返さない場合同期)、またはあなたがプロパティにアクセスしたい、あなたが行うことができます。

const something = (await doSomethingAsync()).someMethod() 
const somethingElse = (await doSomethingAsync()).property 

私はまた、あなたが簡単に交換することができた、任意のテンプレート補間を行うことなく、ほとんどの文字列のためのテンプレートリテラル(バッククォート、`)を使用しているに気づきました'(一重引用符)または(二重引用符)です。あなたは `userController`モジュールから該当するコードを含めることができれば

+0

foundUserを取得する短い方法を試してみると、foundUserログは保留中の約束事としてログに記録されます。 – Kevin

+0

@ケヴィンオハイオ州あなたは正しいです、私の悪いです!応答の 'json()'メソッドは実際には*非同期*であり、Promiseを返します。私はこれを反映するために私の答えを更新しました。ごめんなさい! :) – Svenskunganka

関連する問題