如何使用 Node.js 制作 API 代理?

王宇航

由于 GFW 阻止了一些 ip,包括 flickr 的,我喜欢用 Node.js 制作 API 代理,但是我无法在 http 服务器中打开 GET 请求。这是我的代码:

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);

在这个例子中,我使用了request包(用于npm install request安装)。

这是错误消息:

_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)
Yi Kai

我认为问题是 response.write(getrequest());

getrequest 是一个异步操作,您应该使用回调或承诺它。如果使用回调,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();
       }
    })
})

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在使用node.js和vanilla javascript制作的Web应用程序中使用代理?

来自分类Dev

使用Apache代理的Node.js路由

来自分类Dev

使用请求模块的Node.JS代理

来自分类Dev

Node JS TCP代理:使用Node JS设置HTTP隧道

来自分类Dev

Node JS TCP代理:使用Node JS设置HTTP隧道

来自分类Dev

有关使用Node.js“代理”服务器代理CSS和JS的建议

来自分类Dev

如何在Node.js环境中处理用户代理?

来自分类Dev

如何检测 Node.js 中 HTTP 代理的存在?

来自分类Dev

使用Nginx代理在node.js应用上启用Cors

来自分类Dev

使用代理在VM中安装node.js

来自分类Dev

使用代理将会话保持在node.js中

来自分类Dev

如何制作假代理导入库

来自分类Dev

尝试使用元表制作Lua代理

来自分类Dev

如何从可写流制作可读流?(Node.js)

来自分类Dev

我如何通过node.js http.Client使用和授权http代理

来自分类Dev

如何使用Node.js在React Native中设置代理目标?

来自分类Dev

我如何使用adonis /node.js中的模型实例制作create()方法?

来自分类Dev

带有node.js代理和外部api调用的nginx

来自分类Dev

如何在Google Maps JS API中制作虚线的折线?

来自分类Dev

如何在代理后面配置 node.js (express.js) 应用程序?

来自分类Dev

IIS反向代理到node.js

来自分类Dev

AngularJS + ServiceStack + Node.js作为代理?

来自分类Dev

node.js http代理重定向

来自分类Dev

带有https的Node.js代理

来自分类Dev

从Node.js中的地址设置代理

来自分类Dev

如何在Node.js中使用XHR API?

来自分类Dev

如何从Node-JS API在Webpack中使用-p标志?

来自分类Dev

如何使用Node.js ExpressJS或Superagent调用Freebase API

来自分类Dev

如何从Node-js API使用Webpack中的-p标志?

Related 相关文章

热门标签

归档