Невозможно создать собственный .exe из express.js в Windows

Я использую node.js/express.js в Windows, и у меня есть команда, которую я выполняю, когда пользователь берет изображение и загружает оттуда телефон. После загрузки я запускаю myApp.exe для обработки изображений openCV и вывожу обновленные изображения в выходной каталог, который является аргументом в приведенной ниже команде.

Я могу запустить это из своего веб-приложения с помощью child_process.exec, но производительность в 60 раз ниже, если я запускаю его из командной строки отдельно. Чтобы повысить производительность, я надеялся использовать Spawn, но я не знаю, является ли это точным предположением, пожалуйста, дайте мне знать, если это не так.

var exec = require('child_process').exec; 
var child = exec('C:\\opt\\package_v030_package\\myApp.exe 
--user="C:\\opt\\package_v030_package\\Phone\\'+file.filename+'" 
--mv="C:\\opt\\package_v030_package\\mv\\'+req.body.detectionString+'.bmp" 
--outPath="C:\\opt\\package_v030_package\\output" 
--outputScaled 
--outputScaledOverlaid');

  child.stdout.on('data', function(data) {
      console.log('stdout: ' + data);
  });
  child.stderr.on('data', function(data) {
      console.log('stdout: ' + data);
  });
  child.on('close', function(code) {
      console.log('closing code: ' + code);
      //res.json("success")
  });

Я попытался запустить его с помощью spawn, но он не выполняется со следующим: «Ошибка дочернего процесса завершена с кодом 4294967295». Код ниже:

  var spawn = require('child_process').spawn;
  var cmd = spawn('cmd', ['/s',
  '/c',
  'C:\\opt\\package_v030_package\\myApp.exe',
  '--user="C:\\opt\\package_v030_package\\Phone\\'+file.filename+'"',
  '--mv="C:\\opt\\package_v030_package\\mv\\'+req.body.detectionString+'.bmp"',
  '--outPath="C:\\opt\\package_v030_package\\output"',
  '--outputScaled',
  '--outputScaledOverlaid'
  ]);

  cmd.stdout.on('data', (data) => {
   console.log(`stdout: ${data}`);
  });

  cmd.stderr.on('data', (data) => {
   console.log(`stderr: ${data}`);
  });

  cmd.on('close', (code) => {
    console.log(`child process exited with code ${code}`);
  });

Кажется, я могу выполнить только myApp.exe из спавна, потому что, когда я добавляю любой из своих аргументов, он терпит неудачу. Даже когда я жестко кодирую переменные, которые я ввожу. Есть ли проблема с моими аргументами или я неправильно создаю myApp.exe?

Обновление 1

Я поместил команду в .bat и смог выполнить ее из node.js, используя spawn. Это не увеличивает производительность, что наводит меня на мысль, что снижение производительности является ограничением node.js на платформе Windows.

Кроме того, я выполнил несколько тестов с помощью postman, чтобы увидеть, смогу ли я оптимизировать вызов без каких-либо других действий, но мне это не удалось. Я оставлю этот вопрос открытым на случай, если он изменится, и node.js сможет лучше справляться с производительностью дочернего процесса с интенсивным использованием ЦП.

Обновление 2 и ответ

Я смог исправить это, поместив команду, которую мы запускаем в командной строке, в класс Java, принимающий в качестве параметра строку обнаружения. Затем с узла я использую spawn, чтобы запустить файл .jar. Это привело к значительному увеличению скорости и работе, как если бы я сам запускал ее в командной строке.


person FloppyBriefcase    schedule 11.07.2016    source источник


Ответы (1)


Я смог исправить это, поместив команду, которую мы запускаем в командной строке, в класс Java, принимающий в качестве параметра строку обнаружения. Затем с узла я использую spawn, чтобы запустить файл .jar. Это привело к значительному увеличению скорости и работе, как если бы я сам запускал ее в командной строке.

person FloppyBriefcase    schedule 14.07.2016