Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 类型脚本生成错误_Node.js_Typescript_Async Await - Fatal编程技术网

Node.js 类型脚本生成错误

Node.js 类型脚本生成错误,node.js,typescript,async-await,Node.js,Typescript,Async Await,我正在将一些bash脚本移植到TypeScript。其中大多数是对系统UTIL的顺序调用,如curl、tar、mkdir等 这可能是新手错误,但需要帮助找出此单文件TypeScript代码中的spawn/exec调用的错误: #!/sbin/ts-node import * as child from 'child_process'; const { promisify } = require('util'); const exec = promisify(child.exec); con

我正在将一些bash脚本移植到TypeScript。其中大多数是对系统UTIL的顺序调用,如curl、tar、mkdir等

这可能是新手错误,但需要帮助找出此单文件TypeScript代码中的spawn/exec调用的错误:

#!/sbin/ts-node

import * as child from 'child_process';
const { promisify } = require('util');

const exec = promisify(child.exec);

const basePkgDir = process.env.HOME + '/cross/pkg';
const baseTmpDir = process.env.HOME + '/cross/tmp';

class Formula {
    private pkgDir: string;
    private tmpDir: string;

    constructor(public name: string, public version: string, public url: string) {
        this.url = url.replace(/\${pkgver}/gi, version)

        const pkgName = name + '-' + version;
        this.pkgDir = basePkgDir + '/' + pkgName;
        this.tmpDir = basePkgDir + '/' + pkgName;
    }

    private async run(cmd: string) {
        await exec(cmd, {cwd: this.tmpDir}, (error: Error, stdout: string, stderr: string) => {
            console.log(stdout);    
            if (error)
                console.log(error);  
            if (stderr)
                console.log(stderr)
        });
    }

    private async createDirs() {
        this.run(`mkdir -p ${this.pkgDir}`);
        this.run(`mkdir -p ${this.tmpDir}`);
    }

    private async download() {
        this.run(`curl -LJO ${this.url}`);
    }

    public async process() {
        await this.createDirs();
        await this.download();
    }
}


async function main() {
    const xz = new Formula('xz', '5.2.3', 'https://github.com/xz-mirror/xz/archive/v${pkgver}.tar.gz');
    await xz.process();
}

main().then(
    text => {
        console.log('Done.');
    },
    err => {
        // Deal with the fact the chain failed
        console.log(err)
    }
);
运行脚本会出现以下错误:

{ Error: spawn /bin/sh ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:229:19)
    at onErrorNT (internal/child_process.js:406:16)
    at process._tickCallback (internal/process/next_tick.js:63:19)
    at Function.Module.runMain (internal/modules/cjs/loader.js:745:11)
    at Object.<anonymous> (/usr/lib/node_modules/ts-node/src/bin.ts:147:12)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
  errno: 'ENOENT',
  code: 'ENOENT',
  syscall: 'spawn /bin/sh',
  path: '/bin/sh',
  spawnargs: [ '-c', 'mkdir -p /home/alex/cross/pkg/xz-5.2.3' ],
  cmd: 'mkdir -p /home/alex/cross/pkg/xz-5.2.3' }

{ Error: spawn /bin/sh ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:229:19)
    at onErrorNT (internal/child_process.js:406:16)
    at process._tickCallback (internal/process/next_tick.js:63:19)
    at Function.Module.runMain (internal/modules/cjs/loader.js:745:11)
    at Object.<anonymous> (/usr/lib/node_modules/ts-node/src/bin.ts:147:12)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
  errno: 'ENOENT',
  code: 'ENOENT',
  syscall: 'spawn /bin/sh',
  path: '/bin/sh',
  spawnargs: [ '-c', 'mkdir -p /home/alex/cross/pkg/xz-5.2.3' ],
  cmd: 'mkdir -p /home/alex/cross/pkg/xz-5.2.3' }
Done.

{ Error: spawn /bin/sh ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:229:19)
    at onErrorNT (internal/child_process.js:406:16)
    at process._tickCallback (internal/process/next_tick.js:63:19)
    at Function.Module.runMain (internal/modules/cjs/loader.js:745:11)
    at Object.<anonymous> (/usr/lib/node_modules/ts-node/src/bin.ts:147:12)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
  errno: 'ENOENT',
  code: 'ENOENT',
  syscall: 'spawn /bin/sh',
  path: '/bin/sh',
  spawnargs:
   [ '-c',
     'curl -LJO https://github.com/xz-mirror/xz/archive/v5.2.3.tar.gz' ],
  cmd:
   'curl -LJO https://github.com/xz-mirror/xz/archive/v5.2.3.tar.gz' }
{错误:spawn/bin/sh enoint
在Process.ChildProcess.\u handle.onexit(内部/child\u Process.js:229:19)
在onErrorNT(内部/子进程js:406:16)
在进程中。_tick回调(内部/process/next_tick.js:63:19)
位于Function.Module.runMain(internal/modules/cjs/loader.js:745:11)
at对象。(/usr/lib/node_modules/ts node/src/bin.ts:147:12)
at模块编译(内部/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js(internal/modules/cjs/loader.js:700:10)
在Module.load(内部/modules/cjs/loader.js:599:32)
在tryModuleLoad(内部/modules/cjs/loader.js:538:12)
at Function.Module._load(内部/modules/cjs/loader.js:530:3)
errno:'enoint',
代码:'enoint',
系统调用:“spawn/bin/sh”,
路径:'/bin/sh',
spawnargs:['-c','mkdir-p/home/alex/cross/pkg/xz-5.2.3'],
cmd:'mkdir-p/home/alex/cross/pkg/xz-5.2.3'}
{错误:spawn/bin/sh enoint
在Process.ChildProcess.\u handle.onexit(内部/child\u Process.js:229:19)
在onErrorNT(内部/子进程js:406:16)
在进程中。_tick回调(内部/process/next_tick.js:63:19)
位于Function.Module.runMain(internal/modules/cjs/loader.js:745:11)
at对象。(/usr/lib/node_modules/ts node/src/bin.ts:147:12)
at模块编译(内部/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js(internal/modules/cjs/loader.js:700:10)
在Module.load(内部/modules/cjs/loader.js:599:32)
在tryModuleLoad(内部/modules/cjs/loader.js:538:12)
at Function.Module._load(内部/modules/cjs/loader.js:530:3)
errno:'enoint',
代码:'enoint',
系统调用:“spawn/bin/sh”,
路径:'/bin/sh',
spawnargs:['-c','mkdir-p/home/alex/cross/pkg/xz-5.2.3'],
cmd:'mkdir-p/home/alex/cross/pkg/xz-5.2.3'}
完成。
{错误:spawn/bin/sh enoint
在Process.ChildProcess.\u handle.onexit(内部/child\u Process.js:229:19)
在onErrorNT(内部/子进程js:406:16)
在进程中。_tick回调(内部/process/next_tick.js:63:19)
位于Function.Module.runMain(internal/modules/cjs/loader.js:745:11)
at对象。(/usr/lib/node_modules/ts node/src/bin.ts:147:12)
at模块编译(内部/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js(internal/modules/cjs/loader.js:700:10)
在Module.load(内部/modules/cjs/loader.js:599:32)
在tryModuleLoad(内部/modules/cjs/loader.js:538:12)
at Function.Module._load(内部/modules/cjs/loader.js:530:3)
errno:'enoint',
代码:'enoint',
系统调用:“spawn/bin/sh”,
路径:'/bin/sh',
产卵参数:
['-c',,
“curl-LJOhttps://github.com/xz-mirror/xz/archive/v5.2.3.tar.gz' ],
命令:
“curl-LJOhttps://github.com/xz-mirror/xz/archive/v5.2.3.tar.gz' }

我怀疑这里使用的
async/wait
promisify
的方式有问题。

明白了,原因是
{cwd:this.tmpDir}
在命令运行时
tmpDir
不存在


如果在async/await、exec/spawn上有任何其他潜在错误或建议,请开枪。

结果表明,该错误是由于您的
cwd
不存在而导致的。 只需更改为
{cwd:'/'}
即可使程序在
createDirs()
上成功

另见


我做了以下更改以使其正常工作:

1) 更改了shebang行
#/usr/bin/env ts节点

2)
tsconfig.json

{
  "compilerOptions": {
    "lib": [ "es2015" ]
  }
}