Как устранить ошибку в исполнительном файле child_process в узле

#node.js #error-handling #promise #child-process #mapinfo

#node.js #обработка ошибок #обещать #ребенок-процесс #mapinfo

Вопрос:

В своем приложении я запускаю внешнюю программу MapInfo. В целом это работает нормально, но я получаю ошибку и понятия не имею, как ее решить.

 const util = require('util'); const execFile = util.promisify(require('child_process').execFile); const mbxs = ['DPImapObjCellDir.MBX', 'DPImapObjAdditional.MBX'];  await Promise.all(  mbxs.map(x =gt;  execFile(  config.MapInfo.bin,  ['-server', path.join(config.MapInfo.mbx !== undefined ? config.MapInfo.mbx : __dirname, x)],  {  windowsHide: true,  env: Object.assign(process.env,  {  NLS_LANG: "AMERICAN_SWITZERLAND.WE8MSWIN1252",  DPI_INI: path.resolve(process.argv[2])  })  },  error =gt; { if (error) console.error(error.stack) }  ).catch(e =gt; console.error(e.stack))  ) );   Error: Command failed: c:ProgramsMapInfo ProfessionalMapInfo_12.5MapInfow.exe -server c:DevelopingSourceDPIServerGeneratorMapInfobinDPImapObjAdditional.MBX   at ChildProcess.exithandler (node:child_process:397:12)  at ChildProcess.emit (node:events:390:28)  at maybeClose (node:internal/child_process:1062:16)  at Process.ChildProcess._handle.onexit (node:internal/child_process:301:5)  at Process.callbackTrampoline (node:internal/async_hooks:130:17) {  killed: false,  code: 3221226525,  signal: null,  cmd: 'c:\Programs\MapInfo Professional\MapInfo_12.5\MapInfow.exe -server c:\Developing\Source\DPI\Server\Generator\MapInfo\bin\DPImapObjAdditional.MBX' }  

Согласно журналам в самой MapInfo, программа завершилась без каких-либо ошибок. Поэтому я понятия не имею, почему Node считает программу неудачной.

Ответ №1:

В конце концов, я использовал обходной путь, подобный этому:

 await Promise.all(  mbx.map(x =gt;  execFile(  config.MapInfo.bin,  ['-server', path.join(config.MapInfo.mbx !== undefined ? config.MapInfo.mbx : __dirname, x.bin)],  {  windowsHide: true,  env: Object.assign(process.env,  {  NLS_LANG: "AMERICAN_SWITZERLAND.WE8MSWIN1252",  DPI_INI: path.resolve(process.argv[2]),  DPI_CELL_DIR: x.DPI_CELL_DIR  })  }  ).catch((error) =gt; { if (error amp;amp; error.code != 3221226525) logger.error(error.stack) })  ) );  

execFile() Метод не должен давать никаких callback функций, иначе скрипт завершит работу после Обещания.