#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
функций, иначе скрипт завершит работу после Обещания.