我尝试在以下代码库中重新创建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文件的绝对路径位置。
知道是什么引起的吗?
1条答案
按热度按时间goqiplq21#
ENOENT
通常表示您没有设置派生子进程的工作目录(默认情况下,子进程继承当前工作目录)。您可以通过添加
cwd: migrationsDir
以在env旁边生成函数选项来设置子进程工作目录