如何使用询问器设置答案的默认值?

Cyc*_*ode 5 fs node.js node-modules inquirer

我正在尝试创建一个小型构建脚本,如果在默认路径中找不到 mysql 标头,该脚本将询问用户 mysql 标头的位置。现在我用来inquirer提示用户输入,效果很好,但我遇到了以下问题:

'use strict'
const inquirer = require('inquirer')
const fs = require('fs')

const MYSQL_INCLUDE_DIR = '/usr/include/mysql'

let questions = [
  {
    type: 'input',
    name: 'MYSQL_INCLUDE_DIR',
    message: 'Enter path to mysql headers',
    default: MYSQL_INCLUDE_DIR,
    when: (answers) => {
      return !fs.existsSync(MYSQL_INCLUDE_DIR)
    },
    validate: (path) => {
      return fs.existsSync(path)
    }
  }
]

inquirer.prompt(questions)
  .then((answers) => {
    // Problem is that answers.MYSQL_INCLUDE_DIR might be undefined at this point.
  })
Run Code Online (Sandbox Code Playgroud)

如果找到 mysql 标头的默认路径,则不会显示问题,因此不会设置答案。如何设置问题的默认值而不实际向用户显示它?

解决上述问题也可以做到这一点,而不是使用全局变量:

let questions = [
  {
    type: 'input',
    name: 'MYSQL_INCLUDE_DIR',
    message: 'Enter path to mysql headers',
    default: MYSQL_INCLUDE_DIR,
    when: (answers) => {
      return !fs.existsSync(answers.MYSQL_INCLUDE_DIR)
    },
    validate: (path) => {
      return fs.existsSync(path)
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

Wil*_*ill 4

怎么样:

inquirer.prompt(questions)
  .then((answers) => {
    const mysqlIncludeDir = answers && answers.MYSQL_INCLUDE_DIR ? answers.MYSQL_INCLUDE_DIR : MYSQL_INCLUDE_DIR;
  })
Run Code Online (Sandbox Code Playgroud)

或者更简洁地说:

inquirer.prompt(questions)
  .then((answers) => {
    const theAnswers = {
      MYSQL_INCLUDE_DIR,
      ...answers
    };
    // theAnswers should be the answers you want
    const mysqlIncludeDir = theAnswers.MYSQL_INCLUDE_DIR;
    // mysqlIncludeDir should now be same as first solution above
  })
Run Code Online (Sandbox Code Playgroud)

或者更一般地在 lodash 的帮助下,比如:

const myPrompt = (questions) => inquirer.prompt(questions)
  .then((answers) => {
    return {
      ...(_.omitBy(_.mapValues(_.keyBy(questions, 'name'), 'default'), q => !q)),
      ...answers
    };
  })

myPrompt(questions)
  .then((answers) => {
    // should be the answers you want
  })
Run Code Online (Sandbox Code Playgroud)

最后一个解决方案应该会导致任何带有 和 a 的问题defaultwhen否则可能会隐藏其默认值,从而将其默认值强制包含在答案中。