2016-03-30 3 views
0

Все выполняется в порядке при первом запуске. Но это дает обратный вызов, уже названный ошибкой во втором прогоне. Благодарю.ошибка обратного вызова при втором нажатии

Server Side Код:

async.waterfall([ 
    function(pcallback) { 
     //var mykeyword = ""; 
     //resultset=""; 

     app.post('/login',function(req,res){ 
     Keyword=req.body.keyword; 
     Category=req.body.category; 
     res.setHeader('Access-Control-Allow-Origin', 'http://localhost:9000'); // Website you wish to allow to connect 
     res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); // Request methods you wish to allow 
     res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); // Request headers you wish to allow 
     res.setHeader('Access-Control-Allow-Credentials', true); // Set to true if you need the website to include cookies in the requests sent // to the API (e.g. in case you use sessions) 

     console.log("\nKeyword = "+Keyword+", Category is "+Category); //till here everything is executing fine on 2nd run 
     //mykeyword=user_name; 
     res.end("yes"); 
     pcallback(null, Keyword); 
    }); 



    }, 
    function(mykeyword, pcallback) { 

     Keyword=mykeyword; 
     console.log("\n\nmy keyword ",Keyword) 
     callAWS(Keyword, function(response){ 
      // Here you have access to your variable 
      console.log(response); 
      pcallback(null,response); 
     }) 

    }, function(resultset, pcallback){ 
     app.use(function (req, res) { 
      res.setHeader('Access-Control-Allow-Origin', 'http://localhost:9000/data'); // Website you wish to allow to connect 
      res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); // Request methods you wish to allow 
      res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); // Request headers you wish to allow 
      res.setHeader('Access-Control-Allow-Credentials', true); // Set to true if you need the website to include cookies in the requests sent // to the API (e.g. in case you use sessions) 
      //console.log(resultset) 
      //res.send(resultset) 
      //console.log(resultset); 
      res.send(resultset) 
      res.end(); 
     }); 
     pcallback(); 
}], function(err){ 
    if(err) return(pcallback(err)); 
    console.log("I'm Done !"); 
}); 

Со стороны клиента, у меня есть текстовое поле и кнопка, которая запрашивает определенное ключевое слово.

error details

ответ

1

Я понимаю, что это не так:

Когда вы (первое) выполнить async.waterfall(...) зарегистрировать маршрут для POST/логин, и в обработчике маршрута вы звоните pcallback() каждый раз кто-то сообщения в /login:

async.waterfall([ 
    function(pcallback) { 
     // ... 
     app.post('/login',function(req,res){ 
      // ... 
      pcallback(null, Keyword); // <= bug is here 
      // ... 

async.waterfall ожидает е очень обратный вызов будет вызван только один раз, поэтому при первом посещении клиента все «работает», но когда приходит второй POST, вы вызываете pcallback() снова неожиданно.

Я не уверен, что вы намеревались делать, но я думаю, что исправление может двигаться весь async.waterfall() код внутри обработчика app.post('/login',function(req,res){ });, вместо того, чтобы это наоборот.

Что-то вроде этого (если в данный момент я понял):

app.post('/login',function(req,res){ 
    Keyword=req.body.keyword; 
    Category=req.body.category; 
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:9000'); // Website you wish to allow to connect 
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); // Request methods you wish to allow 
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); // Request headers you wish to allow 
    res.setHeader('Access-Control-Allow-Credentials', true); // Set to true if you need the website to include cookies in the requests sent // to the API (e.g. in case you use sessions) 

    console.log("\nKeyword = "+Keyword+", Category is "+Category); //till here everything is executing fine on 2nd run 
    //mykeyword=user_name; 
    res.end("yes"); 

    // pcallback(null, Keyword); <== pcallback() was HERE before 
    async.waterfall([ 
     function(pcallback) { 
      // Keyword=mykeyword; 
      console.log("\n\nmy keyword ",Keyword) 
      callAWS(Keyword, function(response){ 
       // Here you have access to your variable 
       console.log(response); 
       pcallback(null,response); 
      }) 

     }, function(resultset, pcallback){ 
      app.use(function (req, res) { 
       res.setHeader('Access-Control-Allow-Origin', 'http://localhost:9000/data'); // Website you wish to allow to connect 
       res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); // Request methods you wish to allow 
       res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); // Request headers you wish to allow 
       res.setHeader('Access-Control-Allow-Credentials', true); // Set to true if you need the website to include cookies in the requests sent // to the API (e.g. in case you use sessions) 
       //console.log(resultset) 
       //res.send(resultset) 
       //console.log(resultset); 
       res.send(resultset) 
       res.end(); 
      }); 
      pcallback(); 
     }], function(err){ 
     if(err) return(pcallback(err)); 
     console.log("I'm Done !"); 
    }); 

}); 

Кроме того, я подозреваю, что вы, возможно, еще один скрытый ошибка, в последнем обработчике:

Ваш обработчик

function (err) { 
    if (err) return (pcallback(err)); 
    console.log("I'm Done !"); 
} 

, но нет никакого параметра pcallback (и его не должно быть), поэтому, если только yo Если вы ссылаетесь на другой pcallback, скрытый над этим фрагментом, вы, вероятно, получите исключение, если на самом деле у вас есть ошибка.

Надеюсь, что это поможет :)

+0

Спасибо, миллион. Это решило проблему. –

Смежные вопросы