2016-05-05 3 views
0

Я не могу присвоить значение результата во внутренней функции. любые способы сделать это? Я могу консоль регистрировать переменную результата внутри функции. Кто-то посоветовал мне делать обещания. Я не знаю, как это сделать. Я новичок в узле и экспресс.Назначение объекта внешней функции изнутри внутренней функции javascript

router.post("/register",function(req,res){ 
    var firstName = req.body.firstName; 
    var lastName = req.body.lastName; 
var email = req.body.email; 
var mobile = req.body.email; 
var oauthProvider = req.body.oauthProvider; 
var oauthId = req.body.oauthId; 
var userType = req.body.type; 
if (userType === undefined) { 
    userType = 1; 
} 
var result = {}; 
result.message = "Not edited"; 
connection.model.query("SELECT `id` FROM `users`" + "WHERE users.email = ?",[email],function(err,rows){ 

    if(err !== null) 
    { 
     result.error = err; 
     result.success = false; 
    } else if(rows.length >= 1){ 
     result.success = false; 
     result.message ="User already exists" ; 
    } 
    else 
    { 
     connection.model.query("INSERT INTO `users`(`first_name`,`last_name`,`email`,`mobile`,`password`,`user_type`) VALUES (?,?,?,?,?,?)",[firstName,lastName,email,mobile,password,userType],function(err,res){ 
      if(err !== null) 
      { 
      result.error = err; 
      result.success = false; 
      }else{ 
       var user = { 
        id : res.insertId, 
        first_name : firstName, 
        email : email 
       }; 

       connection.model.query("INSERT INTO `users_profile`(`user_id`) VALUES (?)",[user.id],function(err,profileres){ 
        if(err !== null) 
        { 
        result.error = err; 
        result.success = false; 
        }else{ 

         if(oauthProvider != undefined && oauthId != undefined){ 
          connection.model.query("INSERT INTO `users_oauth`(`user_id`, `provider`, `provider_uid`) VALUES    (?,?,?)",[user.id,oauthProvider,oauthId],function(err,oauthres){ 
           if(err !== null) 
           { 
           result.error = err; 
           result.success = false; 
           result.message = "couldn't create oauth user"; 
           } 
          }); 

         } 
         var token = jwt.sign(user, SECRET, { 
          expiresIn: "15d" // expires in 15 days 
         }); 

         // return the information including token as JSON 
         result.success = true; 
         result.message = 'successfully registered'; 
         result.token = token; 


        } 

       }); 
      } 
     }); 

    } 

    res.setHeader('content-type','text/json'); 
    res.send(json_encode(result)); 


}); 

}); 
+1

Речь идет не о функциональных областях, а о асинхронных обратных вызовах и порядке их выполнения. Поддерживает ли ваше соединение с БД синхронные запросы? –

+0

Запись в БД происходит правильно, но ответ (результат) не получает назначенного –

+1

Я имею в виду, что функция, которую вы передаете 'collection.model.query', является обратным вызовом. Это будет выполняться асинхронно после возвращения БД из запроса. в то же время ваш код продолжается в 'res.setHeader (...'. Это означает, что вы отправляете ответ до выполнения запроса и задаете ответ. –

ответ

1

U должен отправить ответ внутри обратного вызова следующим образом:

result.success = true; 
result.message = 'successfully registered'; 
result.token = token; 
res.setHeader('content-type','text/json'); 
res.send(json_encode(result)); 

вместо отправки ответа вне обратного вызова.

EDIT: хорошо я получил это .. его отрывая Рез запроса, поэтому изменить кодогенератора следующим образом:

router.post("/register",function(httpreq,httpres){ 

result.success = true; 
    result.message = 'successfully registered'; 
    result.token = token; 
    httpres.setHeader('content-type','text/json'); 
    httpres.send(json_encode(result)); 

EDIT: Как вы знаете, Node.js будет выполнять все asychronously, так что в вашем случае вы отправляете ответ res.send b4 завершение обратного вызова. поэтому теперь в моем коде я отправил res после завершения обратного вызова.

+0

не может получить доступ к переменной res внутри функции –

+0

res.send не является ошибкой функции –

+0

спасибо, мужчина !! работал как шарм. Кстати, можно ли объяснить, в чем была проблема? –

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