如何使用查询器为答案设置默认值?

How to set default value for an answer using inquirer?

我正在尝试创建一个小型构建脚本,如果在默认路径中找不到它们,它将询问用户 mysql headers 的位置。现在我正在使用 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.
  })

如果找到 mysql headers 的默认路径,则不会显示问题,因此不会设置答案。如何在不向用户实际显示的情况下为问题设置默认值?

解决上述问题也可以代替使用全局变量来执行此操作:

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

怎么样:

inquirer.prompt(questions)
  .then((answers) => {
    const mysqlIncludeDir = answers && answers.MYSQL_INCLUDE_DIR ? answers.MYSQL_INCLUDE_DIR : MYSQL_INCLUDE_DIR;
  })

或更简洁:

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

或者更一般地说,在 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
  })

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