【发布时间】: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