Javascript 使用 Node JS 在 Node JS 上进行 HTTP 请求回调

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/42220396/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 00:59:40  来源:igfitidea点击:

HTTP request callback on Node JS with Node JS

javascriptjsonnode.jshttp

提问by V. MARTIN

Hi I am trying to get a response via a http using the callback method. But I get a lot of information but not my data :

嗨,我正在尝试使用回调方法通过 http 获得响应。但我得到了很多信息,但不是我的数据:

    Request {
  domain: null,
  _events: 
   { error: [Function: bound ],
     complete: [Function: bound ],
     pipe: [Function] },
  _eventsCount: 3,
  _maxListeners: undefined,
  uri: 
   Url {
     protocol: 'http:',
     slashes: true,
     auth: null,
     host: 'localhost',
     port: 80,
     hostname: 'localhost',
     hash: null,
     search: '?filter=route_short_name',
     query: 'filter=route_short_name',
     pathname: '/php-rest/api.php/routes',
     path: '/php-rest/api.php/routes?filter=route_short_name',
     href: 'http://localhost/php-rest/api.php/routes?filter=route_short_name' },
  callback: [Function],
  readable: true,
  writable: true,
  _qs: 
   Querystring {
     request: [Circular],
     lib: { formats: [Object], parse: [Function], stringify: [Function] },
     useQuerystring: undefined,
     parseOptions: {},
     stringifyOptions: {} },
  _auth: 
   Auth {
     request: [Circular],
     hasAuth: false,
     sentAuth: false,
     bearerToken: null,
     user: null,
     pass: null },
  _oauth: OAuth { request: [Circular], params: null },
  _multipart: 
   Multipart {
     request: [Circular],
     boundary: '9ab5d31f-9896-4fb9-8f89-47e5501e9342',
     chunked: false,
     body: null },
  _redirect: 
   Redirect {
     request: [Circular],
     followRedirect: true,
     followRedirects: true,
     followAllRedirects: false,
     followOriginalHttpMethod: false,
     allowRedirect: [Function],
     maxRedirects: 10,
     redirects: [],
     redirectsFollowed: 0,
     removeRefererHeader: false },
  _tunnel: 
   Tunnel {
     request: [Circular],
     proxyHeaderWhiteList: 
      [ 'accept',
        'accept-charset',
        'accept-encoding',
        'accept-language',
        'accept-ranges',
        'cache-control',
        'content-encoding',
        'content-language',
        'content-location',
        'content-md5',
        'content-range',
        'content-type',
        'connection',
        'date',
        'expect',
        'max-forwards',
        'pragma',
        'referer',
        'te',
        'user-agent',
        'via' ],
     proxyHeaderExclusiveList: [] },
  headers: { host: 'localhost' },
  setHeader: [Function],
  hasHeader: [Function],
  getHeader: [Function],
  removeHeader: [Function],
  method: 'GET',
  localAddress: undefined,
  pool: {},
  dests: [],
  __isRequestRequest: true,
  _callback: [Function],
  proxy: null,
  tunnel: false,
  setHost: true,
  originalCookieHeader: undefined,
  _disableCookies: true,
  _jar: undefined,
  port: 80,
  host: 'localhost',
  path: '/php-rest/api.php/routes?filter=route_short_name',
  httpModule: 
   { IncomingMessage: { [Function: IncomingMessage] super_: [Object] },
     METHODS: 
      [ 'ACL',
        'BIND',
        'CHECKOUT',
        'CONNECT',
        'COPY',
        'DELETE',
        'GET',
        'HEAD',
        'LINK',
        'LOCK',
        'M-SEARCH',
        'MERGE',
        'MKACTIVITY',
        'MKCALENDAR',
        'MKCOL',
        'MOVE',
        'NOTIFY',
        'OPTIONS',
        'PATCH',
        'POST',
        'PROPFIND',
        'PROPPATCH',
        'PURGE',
        'PUT',
        'REBIND',
        'REPORT',
        'SEARCH',
        'SUBSCRIBE',
        'TRACE',
        'UNBIND',
        'UNLINK',
        'UNLOCK',
        'UNSUBSCRIBE' ],
     OutgoingMessage: { [Function: OutgoingMessage] super_: [Object] },
     ServerResponse: { [Function: ServerResponse] super_: [Object] },
     STATUS_CODES: 
      { '100': 'Continue',
        '101': 'Switching Protocols',
        '102': 'Processing',
        '200': 'OK',
        '201': 'Created',
        '202': 'Accepted',
        '203': 'Non-Authoritative Information',
        '204': 'No Content',
        '205': 'Reset Content',
        '206': 'Partial Content',
        '207': 'Multi-Status',
        '208': 'Already Reported',
        '226': 'IM Used',
        '300': 'Multiple Choices',
        '301': 'Moved Permanently',
        '302': 'Found',
        '303': 'See Other',
        '304': 'Not Modified',
        '305': 'Use Proxy',
        '307': 'Temporary Redirect',
        '308': 'Permanent Redirect',
        '400': 'Bad Request',
        '401': 'Unauthorized',
        '402': 'Payment Required',
        '403': 'Forbidden',
        '404': 'Not Found',
        '405': 'Method Not Allowed',
        '406': 'Not Acceptable',
        '407': 'Proxy Authentication Required',
        '408': 'Request Timeout',
        '409': 'Conflict',
        '410': 'Gone',
        '411': 'Length Required',
        '412': 'Precondition Failed',
        '413': 'Payload Too Large',
        '414': 'URI Too Long',
        '415': 'Unsupported Media Type',
        '416': 'Range Not Satisfiable',
        '417': 'Expectation Failed',
        '418': 'I\'m a teapot',
        '421': 'Misdirected Request',
        '422': 'Unprocessable Entity',
        '423': 'Locked',
        '424': 'Failed Dependency',
        '425': 'Unordered Collection',
        '426': 'Upgrade Required',
        '428': 'Precondition Required',
        '429': 'Too Many Requests',
        '431': 'Request Header Fields Too Large',
        '451': 'Unavailable For Legal Reasons',
        '500': 'Internal Server Error',
        '501': 'Not Implemented',
        '502': 'Bad Gateway',
        '503': 'Service Unavailable',
        '504': 'Gateway Timeout',
        '505': 'HTTP Version Not Supported',
        '506': 'Variant Also Negotiates',
        '507': 'Insufficient Storage',
        '508': 'Loop Detected',
        '509': 'Bandwidth Limit Exceeded',
        '510': 'Not Extended',
        '511': 'Network Authentication Required' },
     Agent: { [Function: Agent] super_: [Object], defaultMaxSockets: Infinity },
     globalAgent: 
      Agent {
        domain: null,
        _events: [Object],
        _eventsCount: 1,
        _maxListeners: undefined,
        defaultPort: 80,
        protocol: 'http:',
        options: [Object],
        requests: {},
        sockets: {},
        freeSockets: {},
        keepAliveMsecs: 1000,
        keepAlive: false,
        maxSockets: Infinity,
        maxFreeSockets: 256 },
     ClientRequest: { [Function: ClientRequest] super_: [Object] },
     request: [Function],
     get: [Function],
     _connectionListener: [Function: connectionListener],
     Server: { [Function: Server] super_: [Object] },
     createServer: [Function],
     Client: [Function: deprecated],
     createClient: [Function: deprecated] },
  agentClass: 
   { [Function: Agent]
     super_: 
      { [Function: EventEmitter]
        EventEmitter: [Circular],
        usingDomains: false,
        defaultMaxListeners: [Getter/Setter],
        init: [Function],
        listenerCount: [Function] },
     defaultMaxSockets: Infinity },
  agent: 
   Agent {
     domain: null,
     _events: { free: [Function] },
     _eventsCount: 1,
     _maxListeners: undefined,
     defaultPort: 80,
     protocol: 'http:',
     options: { path: null },
     requests: {},
     sockets: {},
     freeSockets: {},
     keepAliveMsecs: 1000,
     keepAlive: false,
     maxSockets: Infinity,
     maxFreeSockets: 256 } }

My Node JS code is :

我的节点 JS 代码是:

var http    = require('http');

function getRoutes(callback){
 var callback = request('http://localhost/php-rest/api.php/routes?filter=route_short_name', function(error, response, body, callback) {
  if (!error && response.statusCode == 200) {

   result = JSON.stringify(JSON.parse(body));
   //console.log(result);
   //res.setHeader('Content-Type', 'application/json');
   //res.send(result);
   return callback = result;
  } else {
   //res.end('Error: ' + error);
   return callback =  error;
  }
 });
 return callback;
}

app.get('/getRoutes', function(req, res) {

 var data = getRoutes();
 console.log(data);
 //res.setHeader('Content-Type', 'application/json');
 res.send(data);
});

I want the callback (content of result or error). If anyone can help me on this it would be greatly appreciated.

我想要回调(结果或错误的内容)。如果有人可以帮助我,将不胜感激。

回答by Mahasooq

This is how you should write your function using callback. requestmodule doesn't have a callback param, see here.

这就是您应该如何使用回调编写函数的方式。request模块没有回调参数,请参见此处

var http    = require('http');

function getRoutes(callback){
    request('http://localhost/php-rest/api.php/routes?filter=route_short_name', function(error, response, body) {
        if (!error && response.statusCode == 200) {
            result = JSON.stringify(JSON.parse(body));          
            return callback(result, false);
        } else {            
            return callback(null, error);;
        }
    });
}

app.get('/getRoutes', function(req, res) {

    getRoutes(function(err, data){ 
        if(err) return res.send(err);       
        res.send(data);
    });

});

回答by Asif Saeed

You have issues with callback in your code. I think you should learn how to use callbacks. here is tutorial for you https://www.tutorialspoint.com/nodejs/nodejs_callbacks_concept.htm

您的代码中有回调问题。我认为您应该学习如何使用回调。这是你的教程https://www.tutorialspoint.com/nodejs/nodejs_callbacks_concept.htm

    var http    = require('http');

    function getRoutes(callback){
        request('http://localhost/php-rest/api.php/routes?filter=route_short_name', function(error, response, body) {
            if (!error && response.statusCode == 200) {

                result = JSON.stringify(JSON.parse(body));

                return callback(null, result);
            } else {
                return callback(error, null);
            }
        });
    }

    app.get('/getRoutes', function(req, res) {

        getRoutes(function(err, data){
            if(!err){

                    res.send(data);
            }
            else{
                  res.send(err);
            }

        });

    });

回答by Imulate

You didn't do the callbacks right (oops im slow)

你没有正确地进行回调(哎呀我很慢)

var request = require('request');

function getRoutes(callback){

    request('http://localhost/php-rest/api.php/routes?filter=route_short_name', (error, response, body) => {

        if (!error && response.statusCode == 200) {

            result = JSON.stringify(JSON.parse(body));

            callback(null, result);

        } else {

            callback(error, null);

        }
    });

};

app.get('/getRoutes', (req, res) => {

    getRoutes(function(err, data) {

        if (err) console.log('error', err)//error handling

        console.log(data);

    });

});