Next.js:如果子进程没有要返回的数据该怎么办?

时间:2019-02-16 12:13:40

标签: node.js

我正在使用Next.js传递系统调用。代码看起来像这样 (不是精确地这样的,但这足以说明我在做什么):

export async function find(file, searchTerm) {

    const cat = execFile('cat', [file], {maxBuffer: 1024 * 1024});
    const grep = execFile('grep', [searchTerm], {maxBuffer: 1024 * 1024});
    cat.stdout.pipe(grep.stdin);

    return new Promise((resolve, reject) => {
        grep.stdout.on('data', async (d) => {
            setTimeout(() => resolve(d.toString().trim()), 100)
        });
    });
}

请注意,有两个过程:

  • cat

  • grep

cat.stdout被管道传输到grep.stdin,并且当grep.stdout收到data时,整个函数将返回Promise

一切都很好。问题是,如果grep在从searchTerm返回的结果中找不到 ,则不会调用cat的回调,并且整个链条都挂了。

在生产中,我有一个抽象概念,可让我将任意数量的过程链接在一起(如上所述,以grep.stdout.on('data', ...开始)。

是否可以检测链中是否有任何进程返回“ nothing”,并沿管道发送“ nothing”(例如,空字符串)?

谢谢。

3 个答案:

答案 0 :(得分:2)

您可以在此处使用on'exit'事件。

  

子进程结束后发出“退出”事件。如果   流程退出,代码是流程的最终退出代码,否则   空值。如果该过程由于收到信号而终止,则信号为   信号的字符串名称,否则为null。两个将之一   始终为非空。

因此,您可以在发生此事件时拒绝承诺

更多信息:https://nodejs.org/api/child_process.html#child_process_event_exit

答案 1 :(得分:1)

您可以在回调中调用process.exit()函数,如下所示:

const { execFile } = require('child_process');

async function find(file, searchTerm) {

    const cat = execFile('cat', [file], {maxBuffer: 1024 * 1024});
    const grep = execFile('grep', [searchTerm], {maxBuffer: 1024 * 1024}, (error, stdout, stderr) => {
      //Because grep gives an empty string when no match
      if(stdout ===''){
        console.log('emptty')
        process.exit()
      }
    });
    cat.stdout.pipe(grep.stdin)
    return new Promise((resolve, reject) => {
        grep.stdout.on('data', async (d) => {
            setTimeout(() => resolve(d.toString().trim()), 100)
        });
    })
    .then(d => console.log('succes'))
}

答案 2 :(得分:0)

我最终要做的是,对于链中的所有进程,我添加了以下事件侦听器:

p.on('close', (code) => {
    if (code > 0) {
        reject(`child process PID ${p.pid} exited with code ${code}`);
    }
});

如果任何进程的退出代码不是00表示没有错误),请拒绝Promise