0

私は、すべての GET および POST 処理の後 ( app.use(app.router); の後) に位置する、すてきな小さなエラー報告ミドルウェアを作成しました。下記参照。

これは、PostGIS データベースなどにアクセスする単純なクイック GET および POST に最適です。

しかし、一連のディレクトリ、多数のファイルを作成し、1 -> 8 つの child_processes タスクを生成するように設計された POST 要求が 1 つあります。

childProcess.execFile(job.config.FMEPath, ["PARAMETER_FILE", job.fmeParamFile], { cwd: job.root },

そのすべてのセットアップにそれほど時間はかかりません (1 秒未満で、すべて非同期です (私はある時点で非同期ライブラリを使用して 5 つのステップをシーケンスします (以下を参照))。

私の問題はエラー処理です。現在、すべてのファイルを作成してすべての手順を実行する直前に応答を返します。これは、 next(err) が期待どおりに機能していないことを意味します。エラーを報告するための適切なパラダイムは何ですか? エラーのログ [logger.log()] に WINSTON を使用していますが、エラーをサーバーに記録するか、元の要求にも報告する必要があります。これが現在の投稿リクエストです (覚えておいてください、next(err) を呼び出せるようにするには、残りのオブジェクト、req オブジェクト、および next オブジェクトをしばらく保持する必要があります)。

exports.build = function (req, res, next) {
    var config = global.app.settings.config;
    var jobBatch = groupJobs(req.body.FrameList);
    var ticket = tools.newGuid("", true);
    var fileCount = req.body.FrameList.length * nitfMultiplier;
    var ts = timespan.fromSeconds(fileCount / config.TileRate);
    var estimate = ts.hours + ":" + tools.pad(ts.minutes, 2) + ":" + tools.pad(ts.seconds, 2);
    res.set({ 'Content-Type': 'application/json; charset=utf-8' });
    res.send({ ticket: ticket, maxTiles: fileCount, timeEstimate: estimate, tileRate: config.TileRate, wwwURL: config.WWWUrl });
    jobBatchRoot(req, res, jobBatch, config, ticket, next);
};

jobBatchRoot() (その後、多くの処理を行います。そのコードはすべて含めていません。

exports.bugs = function (err, req, res, next) {
    global.app.settings.stats.errors += 1;
    if (err.code == undefined) {
        err.code = 500;
        err.message = "Server Error";
    }
    res.status(err.code);
    logger.log('error', '%s url: %s status: %d \n', req.method, req.url, err.code, { query: req.query, body: req.body, message: err.message, stack: err.stack });
    var desc = req.method + " " + req.url;
    var body = util.format("%j", req.body);
    var query = util.format("%j", req.query);
    var stack = err.stack.split('\n');
    res.format({
        text: function () {
            res.send(util.format("%j", { title: err.message, code: err.code, desc: desc, query: query, message: err.message, stack: err.stack, body: body}));
        },

        html: function () {
            query = tools.pretty(req.query);
            res.render('error', { title: err.message, code: err.code, desc: desc, query: query, message: err.message, stack: stack, body: body });
        }, 

        json: function () {
            res.send({ title: err.message, code: err.code, desc: desc, query: query, message: err.message, stack: err.stack, body: body });
        }
    });

};
4

2 に答える 2

0

私は行って、これをリファクタリングしました。module.exports = function(..) {...} でモジュールを作成しました

次に、クラスを作成するために多くの状態とメソッドを追加しました。これには、ジョブ定義が含まれています。そこで、最上位のディレクトリを作成し、応答を返し、サブジョブを生成します。それらはすべて、高速応答の後に非同期で実行されます。ただし、エラーが発生することはありません。エラーが発生した場合は、WINSTON を使用してサーバーにログを記録し、すべてのビルドが完了したときにジョブ完了情報をユーザーに返します。

于 2014-02-26T16:51:54.817 に答える