【问题标题】:ENOENT error with child_process spawn referencing a plaintext file meant to run nodechild_process spawn 的 ENOENT 错误引用了一个旨在运行节点的纯文本文件
【发布时间】:2022-12-30 03:29:50
【问题描述】:

我正在尝试在此代码库中重新创建迁移函数:https://codesandbox.io/s/e9fykv?file=/migrations/migrate.ts

对于这个问题,该代码库中的相关文件如下:迁移文件夹中的“migrate.ts”和“node-pg-migrate”(以及它们引用的文件和模块)。

我在 Node JS 中创建这个(不是打字稿),并且几乎设置了所有内容,但我现在遇到的核心错误是运行迁移函数时的 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: node ./migrations/migrate.js”):

(在终端——powershell): npm run 向上迁移

输出:

npm WARN config global --global--local 已弃用。采用 --location=global 代替。

桌面服务器@1.0.0 迁移 节点./migrations/migrate.js“向上”

运行命令:'node-pg-migrate --migrations-dir C:\Users\M\NodeJSProjects\xxxx\Prototype2\desktop-server\migrations 向上' 生成路径: C:\Users\M\NodeJSProjects\xxxx\Prototype2\desktop-server\migrations\node-pg-migrate

生成 C:\Users\M\NodeJSProjects\xxxx\Prototype2\desktop-server\migrations\node-pg-migrate ENOENT 子进程退出,代码:-4058 和信号:null

有关更多信息,我尝试将 windowsVerbatimArguments 设置为 true(相同结果),注释掉 node-pg-migrate 中的每一行,并将 $PATH 变量设置为 node-pg-migrate 文件的绝对路径位置。

知道是什么原因造成的吗?

【问题讨论】:

    标签: node.js child-process node-pg-migrate


    【解决方案1】:

    ENOENT通常表示你没有设置spawn子进程工作目录(默认子进程继承当前工作目录)。

    您可以通过将 cwd: migrationsDir 添加到 env 旁边的 spawn 函数选项来设置子进程工作目录

    【讨论】:

      猜你喜欢
      • 2018-01-21
      • 1970-01-01
      • 2016-12-28
      • 2016-09-01
      • 1970-01-01
      • 2013-12-07
      • 2021-03-10
      • 1970-01-01
      • 2016-10-02
      相关资源
      最近更新 更多