我正在使用Node.js使用gRPC连接到执行长时间运行任务的服务器。

在作业进行期间,服务器将单向流发送到客户端(Node.js应用程序)。我需要实现一个“停止”按钮,并被告知关闭gRPC stream将停止正在进行的作业。

目前这是我的代码:

let express = require('express'),
    router = express.Router(),
    grpc = require('grpc'),
    srv = grpc.load(__dirname + '/job_handler.proto').ns;

let startJob = (jobID, parameters) => srv.createJob(jobID, parameters);

router.post('/jobs', (req, res) => {
    let lengthyOperation = startJob(jobID, parameters);
    lengthyOperation.on('data', (data) => {
        console.log(`Data from lengthy operation: ${data}`);
    });

    lengthyOperation.on('end', () =>
        console.log('Lengthy operation completed');
    });

    res.setHeader('Location', `/jobs/${jobID}`);
    res.status(202).send();
});


如您所见,我在创建作业时向客户端发送HTTP 202响应,该响应在后台异步继续。

问题:


如何关闭信息流?
如何访问lengthyOperation变量?

最佳答案

lengthyOperation对象具有cancel方法,该方法可以取消呼叫。因此,当您要停止流时,只需调用lengthyOperation.cancel()

请注意,执行此操作时,它将导致调用以错误结束。我建议添加一个lengthyOperation.on('error', ...)处理程序来处理该错误。

07-26 03:24