Эта конкретная ошибка возникает при попытке отправить более одного ответа на входящий запрос. Когда я проверяю ваш код, я вижу, что этот конкретный фрагмент кода:
script.stdout.on('data', (stdout) => {
console.log(`stdout: ${stdout}`);
done(stdout);
});
Может получить событие data
более одного раза, и когда это произойдет, оно будет вызывать done(stdout)
более одного раза, что вызовет вызывающего абонента res.send()
более одного раза.
С потоками вы не представляете, сколько раз будет вызвано событие data
. Его можно вызывать только один раз или много раз с большим количеством небольших фрагментов данных.
Кроме того, у вас есть только один script
, который используется во всех ваших запросах. Таким образом, каждый раз, когда вы вызываете sendToShell()
, вы добавляете еще один обработчик события script.stdout.on('data', ...)
, чтобы они накапливались, и у вас будут дубликаты, заставляющие вас вызывать done()
более одного раза для каждого события data
. Если вы собираетесь придерживаться этой структуры, вам нужен способ узнать, когда все данные были отправлены для последней команды, а затем вам нужно удалить этот обработчик событий, чтобы они не накапливались.
К вашему сведению, в этом коде также есть проблемы с параллелизмом, поскольку на ваш сервер может поступать несколько запросов, в результате которых вы запускаете команду, и вы не будете знать, какой ответ принадлежит какой команде. Если вы собираетесь оставить только одну открытую оболочку, то вам, вероятно, нужно поставить команды в очередь, чтобы вы не отправляли следующую команду и не настраивали ее обработчики событий для чтения ответа до тех пор, пока не будет выполнена предыдущая команда. Таким образом, вы не будете читать ответ от неправильной команды.