Skip to content

"Keypress" not working when we await answer to a "question" placed in a promise  #42800

Description

@0xARROWK

Version

v16.13.0

Platform

Ubuntu 18.04

Subsystem

No response

What steps will reproduce the bug?

Hello, I have to use keypress after asking a question to a user. For those 2 actions I use readline as follow :

import readline from "readline";

const menu = readline.createInterface({input: process.stdin, output: process.stdout});
let answer = 0;

const myFunc = async () => {
    return new Promise((resolve, reject) => {
        menu.question('Choose an exchange to use : ', function (answer) {
            if (isNaN(answer) || parseInt(answer) < 1 || parseInt(answer) > 10) answer = undefined;
            menu.close();
            resolve(answer);
        });
    });
}

answer = await myFunc();

readline.emitKeypressEvents(process.stdin)
process.stdin.setRawMode(true);
process.stdin.on('keypress', async (character, key) => {
    if (key.name === 'c' && key.ctrl) {
        process.exit()
    }

    if (key.name === '1' || key.name === '2' || key.name === '3' || key.name === '4') {
        console.log(key.name)
    }
});

But I have notice that keypress event is definitely not working when I ask a question before. If I just remove the question part, it works as expected.

How often does it reproduce? Is there a required condition?

It always happens when the condition of asking a question before is respected. I have noticed that when I remove "await" before the function call, it works as expected

What is the expected behavior?

The expected behaviour is : program print "1", "2", "3", "4", when I hit one of these keys, or exit when I hit ctrl+c

What do you see instead?

Instead I see nothing and program doesn't exit.

Additional information

No response

Activity

  1. changed the title [-]Keypress not working after using createInterface[/-] [+]"Keypress" not working after using "question"[/+] on Apr 20, 2022
  2. changed the title [-]"Keypress" not working after using "question"[/-] [+]"Keypress" not working when we await answer to a "question" placed in a promise [/+] on Apr 20, 2022
  3. aduh95 commented on Apr 20, 2022

    @aduh95
    Contributor

    The await myFunc is blocking the rest of the code to be executed, which results on the 'keypress' event listener to be added only after the 'question' event has been emitted. If you move the answer = await myFunc() after the process.stdin.on('keypress', …) call, it should work as expected.

    FWIW, you can use node:readline/promises module on Node.js 17+:

    import { createInterface } from 'node:readline/promises';
    import { emitKeypressEvents } from 'node:readline';
    
    const menu = createInterface({
      input: process.stdin,
      output: process.stdout,
    });
    let answer = 0;
    
    emitKeypressEvents(process.stdin);
    process.stdin.setRawMode(true);
    process.stdin.on('keypress', async (character, key) => {
      switch (key.name) {
        case '1':
        case '2':
        case '3':
        case '4':
          console.log(key.name);
          break;
    
        case 'c':
          if (key.ctrl) process.exit();
        default:
      }
    });
    
    answer = await menu.question('Choose an exchange to use : ');
    
    if (isNaN(answer) || parseInt(answer) < 1 || parseInt(answer) > 10)
      answer = undefined;
    menu.close();
  4. github-actions commented on Jun 25, 2026

    @github-actions
    Contributor

    This issue has been marked as stale due to 210 days of inactivity.
    It will be automatically closed in 30 days if no further activity occurs. If this is still relevant, please leave a comment or update it to keep it open.

  5. added
    staleIssues and PRs marked stale due to inactivity and scheduled for automatic closure.
    on Jun 25, 2026
  6. github-actions commented on Jul 27, 2026

    @github-actions
    Contributor

    This issue has been automatically closed after 30 days of inactivity following its stale status (no activity for a total of 120 days).
    If this is still relevant, feel free to reopen it or leave a comment with additional details so we can continue the discussion.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    staleIssues and PRs marked stale due to inactivity and scheduled for automatic closure.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions