NodeJS — Почему добавление кавычек в «узел» изменяет поведение результирующей программы?

#node.js #windows

#node.js #Windows

Вопрос:

Рассмотрим следующую крошечную программу на JavaScript:

 #!/usr/bin/env node

const inquirer = require('inquirer');

async function foo() {
  const response = await inquirer.prompt({
    type: "confirm",
    name: "foo",
    message: "Do you want to foo?",
    default: true,
  });

  console.log(response.foo);
}

foo();
 

Все, что делает эта программа, это задает конечному пользователю вопрос, используя Inquirer.js библиотека.

Однако использование стандартного терминала Git Bash (в Windows), вызов его с кавычками и без кавычек изменяет поведение программы, как показано на следующем скриншоте:

Git Bash

Когда кавычки помещаются вокруг узла, это приводит к дублированию вопроса в терминале, что делает программу похожей на сбой.

  1. Почему добавление кавычек в «узел» изменяет поведение программы?
  2. Есть ли какое-то исправление, которое я могу включить в свой код JavaScript, чтобы обойти эту проблему?

Комментарии:

1. Цветовые коды узлов (и браузеров) регистрируют выражения в зависимости от того, к какому типу они относятся, что, вероятно, частично связано с тем, что здесь происходит.

Ответ №1:

изображение терминала без странного поведения

Я не думаю, что это ваша программа.


Мне кажется, что проблема заключается только в обновлении строки. Чтобы уменьшить проблему, попробуйте тот же эксперимент с этой программой, которую я нашел:

 var util = require('util');
var x = 0;
setInterval(function() {
  process.stdout.write('hello: '   x   'r');
  x  ;
}, 1000);
 

источник: https://gist.github.com/markcode/a8b1bfa545bb701daa2c

У этой программы нет цветов, поэтому, если это происходит, это просто потому, что помещение «узла» в кавычки делает его таким, что он не может r без n

Если заменить main на приведенную выше программу, вы и поместите ее в кавычки, и увидите это, тогда вы ближе

 $ "node" main.js
hello: 1
hello: 2
hello: 3
 

Пожалуйста, дайте мне знать ответ, если вы его решите.. действительно интересно.


хорошо, я получил еще одну идею, быстро просмотрев их код и посмотрев, где у них есть if, который добавляет a n — это довольно долгий путь, но попробуйте запустить эту программу с кавычками и без кавычек вокруг узла

 const readline = require('readline');
const cliWidth = require('cli-width');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

console.log(cliWidth({
  defaultWidth: 80,
  output: rl.output,
}));

process.exit(0);
 

он должен быть сохранен в этом каталоге проекта, потому cli-width что как зависимость проекта.

Мне интересно, выдает ли эта программа вам 0 , когда вы используете кавычки, и это приводит к тому, что это происходит:

     if (rawPromptLine.length % width === 0) {
      content  = 'n';
    }
 

(из https://github.com/SBoudrias/Inquirer.js/blob/caefb11e7970bbec454be979e6f5d24e40d1b0bb/packages/core/lib/screen-manager.js)

Комментарии:

1. 0h n то, что я ввел в качестве аргумента.. это случайность… Я только что повторил попытку.. это не имеет никакого отношения ни к чему.. так что не позволяйте n after main.js сбить вас с толку

2. Также что вы получаете за "node" --version и node --version ?

3. 1) Не похоже, что вы используете Git Bash для Windows. 2) Я опробовал эту программу, и помещение узла в кавычки не меняет поведение программы.

4. Да — я использую просто обычный bash. Вот почему я подумал, что это должно быть связано со средой… но теперь я вижу, что это сложнее, чем это .. что-то в этой библиотеке ведет себя забавно в этом одном случае с git bash!

5. Я добавил еще одну перспективную идею, прежде чем мне придется одолжить компьютер друга с Windows, чтобы попробовать это. Пожалуйста, взгляните на мое обновление, если у вас есть секунда