2017-06-05 6 views
0

GFWはflickrを含むいくつかのIPをブロックするので、私はNode.jsでAPIプロキシを作っていますが、httpサーバ内でGETリクエストを開くのに問題があります。私は(インストールに使用npm install requestrequestパッケージを使用この例ではNode.jsでAPIプロキシを作成する方法は?

var http = require('http'); 
var qs = require('querystring'); 
var curl = require('request'); 
var serverPort = 3000; 
http.createServer(function (request, response) { 
    if(request.method === "GET") { 
    response.writeHead(401, {'Content-Type': 'text/html'}); 
    response.write('<!doctype html><html><head><title>401</title></head><body>401: Unauthorized</body></html>'); 
    response.end(); 
    } else if(request.method === "POST") { 
    if (request.url === "/") { 
     var requestBody = ''; 
     request.on('data', function(data) { 
     requestBody += data; 
     if(requestBody.length > 1e7) { 
      response.writeHead(413, 'Request Entity Too Large', {'Content-Type': 'text/html'}); 
      response.end('413: Request Entity Too Large'); 
     } 
     }); 
     request.on('end', function() { 
     var body = getrequest(); 
     if (body === false) { 
      response.writeHead(502, 'Bad Gateway', {'Content-Type': 'text/html'}); 
      response.end('502: Bad Gateway'); 
     } else { 
      response.writeHead(200, {'Content-Type': 'text/html'}); 
      response.write(body); 
      response.end(); 
     } 
     }); 
    } else { 
     response.writeHead(404, 'Resource Not Found', {'Content-Type': 'text/html'}); 
     response.end('<!doctype html><html><head><title>404</title></head><body>404: Resource Not Found</body></html>'); 
    } 
    } else { 
    response.writeHead(405, 'Method Not Supported', {'Content-Type': 'text/html'}); 
    return response.end('<!doctype html><html><head><title>405</title></head><body>405: Method Not Supported</body></html>'); 
    } 
}).listen(serverPort); 
function getrequest(){ 
    return curl('https://api.flickr.com/services/rest/?method=flickr.photosets.getList&api_key={{insert_ur_api_key}}&user_id={{insert_ur_user_id}}&format=json', function (error, response, body) { 
    if (error) { 
     return false; 
    } else { 
     return body; 
    } 
    }); 
} 
console.log('Server running at localhost:'+serverPort); 

:ここに私のコードです。ここで

はエラーメッセージです:

_http_outgoing.js:655 
    throw new TypeError('First argument must be a string or Buffer'); 
    ^

TypeError: First argument must be a string or Buffer 
    at write_ (_http_outgoing.js:655:11) 
    at ServerResponse.write (_http_outgoing.js:630:10) 
    at IncomingMessage.<anonymous> (/Users/aero/Documents/Design/0522-aerofotea api/www/index.js:28:20) 
    at emitNone (events.js:105:13) 
    at IncomingMessage.emit (events.js:207:7) 
    at endReadableNT (_stream_readable.js:1045:12) 
    at _combinedTickCallback (internal/process/next_tick.js:102:11) 
    at process._tickCallback (internal/process/next_tick.js:161:9) 

答えて

0

私は問題がresponse.write(getrequest());

のGetRequestが非同期動作である、あなたはコールバックを使用するか、それをpromisifyすべきだと思います。あなたがコールバックを使用する場合は、のGetRequest関数は次のようにする必要があります:

function getrequest(callback){ 
    curl('https://api.flickr.com/services/rest/?method=flickr.photosets.getList&api_key={{insert_ur_api_key}}&user_id={{insert_ur_user_id}}&format=json', (error, response, body)=> { 
     if (error) { 
      callback(error); 
      return; 
     } 
     callback(null, body); 
    }); 
} 

そして、このようにそれを使用します。

request.on('end', function() { 
    getrequest((err, body)=>{ 
     if (err) { 
      response.writeHead(502, 'Bad Gateway', {'Content-Type': 'text/html'}); 
      response.end('502: Bad Gateway'); 
     } else { 
      response.writeHead(200, {'Content-Type': 'text/html'}); 
      response.write(body); 
      response.end(); 
     } 
    }) 
}) 
+0

あなたは '')が欠落しているそれ以外の場合は動作します。ありがとう。 –

+0

追加されました。 –

関連する問題