NodeJS child_process派生引用要运行节点的纯文本文件时出现ENOENT错误

ryhaxcpt  于 2023-01-01  发布在  Node.js
关注(0)|答案(1)|浏览(143)

我尝试在以下代码库中重新创建migrate函数:https://codesandbox.io/s/e9fykv?file=/migrations/migrate.ts.
对于此问题,该代码库中的相关文件如下:迁移文件夹中的"migrate. ts"和"node-pg-migrate"(以及它们引用的文件和模块)。

    • 我在NodeJS(而不是typescript)中重新创建了它**,并且几乎设置了所有内容,但是我现在遇到的核心错误是运行迁移函数时出现的ENOENT错误,特别是在引用"node-pg-migrate"文件的child_process spawn调用期间。

看起来错误是我甚至不能为spawn调用引用该文件--所以我甚至还没有遇到该文件中代码本身的任何内部错误。
下面是我的"migrate.js"代码:* * 迁移. js**

import { spawn } from 'child_process';
import * as path from 'path';
import dotenv from 'dotenv';
import * as url from 'node:url';

dotenv.config();

const __dirname = url.fileURLToPath(new URL('.', import.meta.url));

export function migrate(commandArguments, migrationsDir = __dirname)
{

    const spawnArgs = ['--migrations-dir',
        migrationsDir,
        ...commandArguments
    ];

    console.log('Running command:');
    console.dir(`node-pg-migrate ${spawnArgs.join(' ')}`);

    console.log(`Spawn Path: \n${path.resolve(migrationsDir, 'node-pg-migrate')}\n`);

    const child = spawn(
        path.resolve(migrationsDir, 'node-pg-migrate'),
        spawnArgs,
        {
            env: { ...process.env },
            windowsVerbatimArguments: false
        }
    );

    child.on('error', function (error) {
        console.log(error.message);
    });

    child.stdout.on('data', function (data) {
        console.log('stdout output: ');
        console.log(data.toString());
    });

    child.stderr.on('data', function (data) {
        console.log('stderr output: ');
        console.log(data.toString());
    });

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

    return child;
}

//CJS Check
// if (require.main === module) {
//     migrate(process.argv.slice(2), path.resolve(__dirname, '../migrations'))
// }

//ES6 Main Check
if (import.meta.url.startsWith('file:')) {
    const modulePath = url.fileURLToPath(import.meta.url);
    if (process.argv[1] === modulePath) {
        migrate(process.argv.slice(2), path.resolve(__dirname, '../migrations'));
    }
}

这是我的node-pg-migrate代码:* * 节点-pg-迁移**

#!usr/bin/env node

require('../config/nodeconfig.json')
require('../node_modules/node-pg-migrate/bin/node-pg-migrate')

以下是运行此migrate函数的输出(migrate的脚本为"migrate:节点./migrations/migrate.js "):
在终端-powershell中):npm运行向上迁移

    • 输出:**

npm警告配置全局--global--local已弃用。请改用--location=global
桌面服务器@1.0.0迁移节点./migrations/migrate.js "up"
运行命令:'节点pg迁移--迁移目录C:\用户\M\ NodeJS Projects\xxxx\原型2\桌面服务器\向上迁移'生成路径:C:\用户\M\ NodeJS Projects\xxxx\原型2\桌面服务器\迁移\节点-pg-迁移
派生C:\用户\M\ NodeJS Projects\xxxx\原型2\桌面服务器\迁移\节点-pg-迁移ENOENT子进程退出,代码为:-4058和信号:零
为了了解更多信息,我尝试将windowsVerbatimArguments设置为true(结果相同),注解掉node-pg-migrate中的每一行,并将$PATH变量设置为node-pg-migrate文件的绝对路径位置。
知道是什么引起的吗?

goqiplq2

goqiplq21#

ENOENT通常表示您没有设置派生子进程的工作目录(默认情况下,子进程继承当前工作目录)。
您可以通过添加cwd: migrationsDir以在env旁边生成函数选项来设置子进程工作目录

相关问题