2

私はいくつかのnode.jsコードで手を汚そうとしています。イベント、コールバック、および非同期技術の理論は理解していますが、「正しい方法」で実際にコードを生成するのが簡単だという意味ではありません。

以下は、私の (実際の) ミドルウェアの例です。単純な HTTP サーバーがリクエストをリッスンし/get、バックエンドにクエリを実行して、そこからのデータをクライアントに提示します。

var http = require('http')
var https = require('https')
var url = require('url')

var backendOptions = {
    port: 1414,
    hostname: 'data.backend.com',
    path: '/bulk',
    auth: 'user:$ecret'
}

var backendGet = function(callback) {
    https.get(backendOptions, function(res) {
        var content = ''
        res.on('data', function(chunk) {
            content += chunk
        })
        res.on('end', function() {
            callback(content)
        })
    })
}

var server = http.createServer(function(req, res) {
    switch(url.parse(req.url).pathname) {
        case '/get':
            backendGet(function(content) {
                res.writeHead(200, {'Content-Type': 'text/plain'})
                res.write(content)
                res.end()
            })
            break
        default:
            res.writeHead(200, {'Content-Type': 'text/html'})
            res.write('<p>It works!</p>')
            res.end()
    }
}).listen(8080, 'localhost')

このコードは機能しますが、これは node.js でコードを記述する方法ですか? バックエンドからのデータが利用可能になったときにクライアントを提供する必要があるため、読み取るバックエンド データがなくなるとすぐにオブジェクトbackendGet()を操作するコールバックとして関数を呼び出しています。res

一般的なコメントや批評も大歓迎です!

アレックス

4

1 に答える 1

2

これはかなりしっかりしているように見えます。私はいくつかの微調整を行いますが、最大のものは、コールバックが関数シグネチャを持つのが慣習的であることですfunction callback(err, result1, result2..)callback(null, content)そして、それが機能した場合、callback('Problem')または機能callback(new Error('Problem'))しなかった場合に呼び出します。

上記の規則を使用してエラー処理を追加しました。私の知る限り、末尾のセミコロンがなくても何も壊れませんが、習慣から追加しました。明確にするために、リクエストを処理する無名関数を独自の関数に移動しました。最後に、コールバック地獄をより管理しやすくするため、2 つのスペースに再インデントしました。

var http = require('http');
var https = require('https');
var url = require('url');

var backendOptions = {
  port: 1414,
  hostname: 'data.backend.com',
  path: '/bulk',
  auth: 'user:$ecret'
};

var backendGet = function(callback) {
  https.get(backendOptions, function(res) {
    var content = '';
    res.on('data', function(chunk) {
      content += chunk;
    });
    res.on('end', function() {
      callback(null, content);
    });
    res.on('error', function(err) {  
      // i didn't look up this syntax but I think this is how errors are signified
      console.log('Request error: '+err);
      callback('Request error');
    });
  });
};

function handler(req, res){
  switch(url.parse(req.url).pathname) {
    case '/get':
      backendGet(function(err, content) {
        if(err){
          res.writeHead(500, {'Content-Type': 'text/plain'});
          res.write('Request error');
          return res.end();
        };
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.write(content);
        res.end();
      })
      break;
    default:
      res.writeHead(200, {'Content-Type': 'text/html'});
      res.write('<p>It works!</p>');
      res.end();
  }
};

var server = http.createServer(handler).listen(8080, 'localhost');
于 2013-08-09T13:24:09.880 に答える