1

因此,我正在编写一个节点 CLI 应用程序,该应用程序包含一个纸牌游戏,用户在该游戏中抽取 5 张牌,然后可以选择摆脱他手中的最多 4 张牌。

我正在用 Javascript 编写它,并且正在使用以下 npm 模块

  • 亚格斯
  • 询问者

我还为以下 API http://deckofcardsapi.com/创建了一个包装器

使用查询器,用户可以从他当前选择最多 4 张卡来处理,但是我遇到了一些问题。我并不完全了解如何将用户当前的手牌传递给查询器提示中的选择数组。我已经尝试了一些事情,但我不断收到以下错误:

(节点:13764)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 id:2):TypeError:无法读取未定义的属性“then”
(节点:13764)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

这是我的代码

cli.js
用于解析命令行参数以通过调用初始化应用程序node cli.js play

const 
app = require('./app'),
yargs = require('yargs')

const flags = yargs.usage('$0: Usage <cmd> [options]')
.command({
    command: 'play',
    desc: 'play a 5 card draw game',
    builder: (yargs) => {
        return yargs.option('play', {
            alias: 'play',
            describe: 'shuffles deck and draws 5 random cards'
        })
    },
    handler: (argv) => { app.play() }
})
.help('help')
.argv

app.js
包含用于运行应用程序的方法

const
    cards = require('deckofcards'),
    inquirer = require('inquirer')

const prompt = inquirer.createPromptModule();

const draw = (shuffle, n = 1) => {
    cards.deck(shuffle)
        .then(deck => cards.draw(deck.deck_id, n))
        .then(result => {
            console.log('-- CARDS --')
            result.cards.forEach(card => {
                console.log(`${card.value} of ${card.suit}`)
            })

            console.log('-- REMAING CARDS --')
            console.log(result.remaining)

            discardPrompt(result)
        })
        .catch(err => console.log(err))
}


const discardPrompt = (result) => {      
    return prompt([{
        type: 'checkbox',
        message: 'select cards to throw away',
        name: 'cards',
        choices: () => {
            const cardsToThrow = []
            result.cards.forEach(card => {
                const obj = {number : card.value, face : card.suit}
                cardsToThrow.push(obj)
            }).then(
                choices.push(cardsToThrow)
            ).catch(err => console.log(err))
        }, 
        validate: () => function(answer) {
            if(answer.length < 1 && answer.length >= 5) {
                return "invalid selection, you must select at least 1 card and no more than 4"
            }       
        return true
        }  
    }])
}


const play = () => {
    draw(true, 5)
}

module.exports = {
    play
}

这是我为 Deck of Cards API index.js创建的包装器

const
     config = require('./config'),
     superagent = require('superagent')


const _fetch = (command) => {
    return superagent.get(`${config.url}/${command}`)
        .then(response => response.body)
        .catch(error => error.response.body)
}

exports.deck = (shuffle) => {
    if (shuffle)
        return _fetch('deck/new/shuffle/?deck_count=1')
    else
        return _fetch('deck/new/')
}

exports.draw = (deck, n) => {
    return _fetch(`/deck/${deck}/draw/?count=${n}`)
}

exports.shuffle = (deck, n) => {
    return _fetch(`deck/${deck}/shuffle/`)
}

当我运行它时,我得到以下输出

node cli.js play
-- CARDS --
ACE of CLUBS
6 of CLUBS
7 of HEARTS
2 of SPADES
QUEEN of CLUBS
-- REMAING CARDS --
47    

我承认我对 Javascript 相当陌生,并且主要来自 Java 编码,事情的流程对我来说有点抽象,但任何建议都将不胜感激

4

0 回答 0