2015-11-02 5 views
0

У меня есть следующий код, который не возвращает данные должным образом.NodeJS Возвращаемые данные

app.post('/login',function(req,res){ 
    sess=req.session; 
    var au = authme(req.body.name,req.body.pass, function(err,data) { 
      if(err) { 
        return 'error'; 
      } 
      console.log(data); 
      return data; 
    });  
    if(au) { 
      sess.username = au.name;   
    } 
    res.end('done'); 
}); 

Данные передаются до конца console.log (данные); но когда я пытаюсь использовать in в инструкции au, его возврат не определен.

+2

Возможные дублируют http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an- асинхронный вызов – tforgione

ответ

1

Это классическая проблема асинхронности. authme работает асинхронно, поэтому код не работает просто сверху вниз.

var au = authme(req.body.name,req.body.pass, function(err,data) { 
    console.log('I am second!') 
});  

console.log('I am first!') 

Необходимо немного изменить структуру кода, чтобы получить желаемое поведение.

app.post('/login',function (req,res) { 
    authme(req.body.name,req.body.pass, function(err, data) { 
    if (err) { 
     return 'error'; 
    } 

    if (data) { 
     req.session.username = data.name; 
    } 

    res.end('done'); 
    }); 
}); 
1

Возможно функциональный вызов authme асинхронный. Поместите свой оператор if в обратный вызов вызова функции, чтобы убедиться, что он всегда проверяется после завершения асинхронной функции.

app.post('/login',function(req,res){ 
    sess=req.session; 
    (authme(req.body.name,req.body.pass, function(err,data) { 
      if(err) { 
        return 'error'; 
      } 
      console.log(data); 

      if(data) { 
        sess.username = au.name;   
      } 
    }))(); 
    res.end('done'); 
}); 
1

В операциях Nodejs асинхронно - короче это означает, что результат будет решена позже, вы не знаете точно, когда, в то время как выполнение кода продолжается, не дожидаясь его. Способ обработки такого вызова - это обратные вызовы. Подробнее об этой теме here и here.

Итак, с вашим кодом вы попадаете в эту классическую ловушку. Эта часть кода

var au = authme(req.body.name,req.body.pass, function(err,data) { 
      if(err) { 
        return 'error'; 
      } 
      console.log(data); 
      return data; 
    }); 

асинхронный вызов, это означает, что эта часть

function(err,data) { 
       if(err) { 
         return 'error'; 
       } 
       console.log(data); 
       return data; 
     } 

является обратным вызовом, который работает только тогда, когда полученный результат. В то время как эта часть

if(au) { 
      sess.username = au.name;   
    } 

выполняется сразу после того, какvar au = authme(req.body.name,req.body.pass) делается. К этому моменту не существует au, поэтому вы получаете эту ошибку.

В вашем случае вы должны поставить а.е. проверить в функцию обратного вызова:

authme(req.body.name,req.body.pass, function(err,data) { 
      if(err) { 
        return 'error'; 
      } 
      if(au) { 
       req.session.username = au.name;   
     } 
      res.end('done'); 
    }); 
Смежные вопросы