Обратный вызов ошибки не определен

Я новичок в node.js и не могу понять концепцию обратного вызова и async.parallel. Я пытаюсь запустить приведенный ниже код node.js в APIGEE. Это дает мне ошибку, говорящую, что обратный вызов не определен.

var request = require('request');
var async = require('async');
var express = require('express');
var urlparse = require('url');
var util = require('util');
var app = express();
var merge= require('underscore');
var http = require('http'); 
var myJson;
var myJson1;
var address_ups;


function sendError(resp, code, msg) {
    var oa = { 'error' : msg };
    resp.writeHead(code, {'Content-Type' :'applicationjson'});
    resp.end(JSON.stringify(oa));
}


var svr = http.createServer(function(req, resp) {
    var parsed = urlparse.parse(req.url, true);
    var postalcode=parsed.query.postalcode;
    if (!parsed.query.postalcode) {
        sendError(resp, 400, 'Missing query parameter postalcode');
    } else {
        async.parallel([


         function ups(postalcode,callback) {
       request('URL1', function(err, result, body) {
        if (err) {
        sendError(resp, 400, 
              util.format('Error response %s from geocoding web service', err.message));
        //cb(err);
         return;
        }
        else
        {
  profile = JSON.parse(body);
        }  
       });
       callback(postalcode,profile);
            },


       function dhl(postalcode,profile,callback) {
       request('URL2', function (err, result, body) {
        if (err) {
        sendError(resp, 400, 
              util.format('Error response %s from elevation web service', err.message));

        callback(err);
        return;
        }
        else
        {
  profile1 = JSON.parse(body);
  var profile3={'ups':profile,'dhl':profile};
        }
       });
       callback(profile3);
            }
       ], function(err,profile3) {
    if (err) {
        resp.status(500).send('Ouch,We had a problem!');
        //throw err; //Or pass it on to an outer callback, log it or whatever suits your needs
    }else{
        //o={'UPS':UPS,'DHL':DHL};
        resp.writeHead(200, {'Content-Type' :'applicationjson'});
    resp.end(JSON.stringify(profile3));

    }
    //console.log('Both a and b are saved now');
     });

    }
    });


svr.listen(9000, function() {
    console.log('Node Mashup sample app is running on port 9000');
    });

Пожалуйста, имейте в виду, что код не чистый.
Пожалуйста, также объясните концепцию async.parallel и обратных вызовов в Node.js.


person Nikhil Preeth    schedule 26.01.2016    source источник
comment
Возможный дубликат различия между async.series и async.parallel   -  person nyarasha    schedule 26.01.2016


Ответы (1)


Проверьте тип почтового индекса в своей первой функции следующим образом:

console.log(typeof postalcode); // function?

Я ожидаю, что это функция. то есть функция обратного вызова.

Для async.parallel не следует передавать никаких аргументов, кроме обратного вызова. Параллельные функции выполняются одновременно, поэтому вы не можете передавать данные от одной к другой!

Даже если вы используете что-то, что принимает аргументы, такие как async.waterfall, первый аргумент функции принимает только обратный вызов.

Типичное использование водопада:

async.waterfall([
    function (callback) { callback(arg1);  },
    function (arg1, callback) { callback(); }],
    function (err) {});

И параллельно:

async.parallel([
    function ups (callback) {

        // happening at the same time so nothing to pass!
        callback();
    },
    function (callback) {
        callback(); //etc.
    }],
    function (err) {});

В вашем случае вы генерируете

  • почтовый индекс НАХОДИТСЯ за пределами асинхронной конструкции, поэтому вам не нужно его передавать.
  • профиль внутри асинхронной конструкции, поэтому вы должны использовать серию или водопад.

то есть Измените свой код, чтобы он выполнял следующие действия:

var postalcode = "12345"; // This is available globally
                          // inside waterfall functions
async.waterfall([
    function (callback) {
       // generate some new profile data ...

       request('URL1', function(err, result, body) {
           if (err) {
               sendError(resp, 400,
                   util.format('Error response %s from geocoding web service', err.message));
               callback(err); // errors are passed back first.
               return;
           } 

           // Return callback inside request function!
           profile = JSON.parse(body);

           // for next funciton null will be ignored, profile is taken as
           // first argument
           callback(null, profile);
       });          
    },
    function (profile, callback) {
        request('URL2', function (err, result, body) {
            if (err) {
                sendError(resp, 400,
                    util.format('Error response %s from elevation web service', err.message));

                // error so pass back non-null first argument.
                callback(err);
                return;
            } 

            profile1 = JSON.parse(body);
            var profile3={'ups':profile,'dhl':profile};

            // Again. callback inside request callback body.
            // null first because there is no error
            callback(null, profile3);   
        });

    }], 
   function (err, profile) { // etc


   })
person chriskelly    schedule 26.01.2016