2

Node.js を使用して、長時間実行されるタスクを実行するgRPCを使用してサーバーに接続しています。

サーバーは、ジョブの進行中に一方向ストリームをクライアント (Node.js アプリ) に送信します。停止ボタンを実装する必要があり、gRPC ストリームを閉じると進行中のジョブが停止すると言われました。

これは現在私のコードです:

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応答をクライアントに送信し、バックグラウンドで非同期に続行します。

質問:

  1. ストリームを閉じるにはどうすればよいですか?
  2. 変数にアクセスするにはどうすればよいlengthyOperationですか?
4

1 に答える 1

2

lengthyOperationオブジェクトには、呼び出しをキャンセルするメソッドcancelがあります。したがって、ストリームを停止したい場合は、 を呼び出すだけlengthyOperation.cancel()です。

これを行うと、呼び出しがエラーで終了することに注意してください。lengthyOperation.on('error', ...)そのエラーを処理するハンドラを追加することをお勧めします。

于 2015-12-04T20:36:42.670 に答える