2016-06-13 1 views
0

Я успешно сделал ajax-вызов конечной точки, которую я установил. Я отправляю ему необработанный сертификат как JSON, а бэкэнд декодирует его. Теперь я могу воспроизвести декодированный результат с console.log, но я не могу понять, как вернуть его в качестве результата.Как получить результат JQuery AJAX от конечной точки NodeJS?

Ajax вызовов:

$("#decoderSubmit").on('click', function() { 
     var body = $('#csr').val(); 
     if (!(body.match(new RegExp("-----BEGIN", 'i')))) { 
      $('#csrFail').show(); 
     } else { 
      if (body.match(new RegExp("REQUEST", 'i'))) { 
       $("#csrAlert").show(); 
      } else 
       $("#certAlert").show(); 

      decode(body); 

     } 
    }); 

    function decode(body) { 

     $.ajax({ 
      type: 'POST', 
      url: '/api/decoder', 
      data: { 
       body: body //cert/csr 
      }, 
      dataType: 'JSON', 
      timeout: 4500, 
      success: callback, 
      error: fail 


     }); 

     function callback(data) { 

      //decodedText = data; 
      alert(data); 
      //$("#decodeBody").append('<div>' + data + '</div>'); 

     } 

     function fail(request, status, err) { 
      console.log(err); 
     } 


    } 

NodeJS Endpoint:

router.route('/decoder') 
    //console.log('test'); 

.post(function(req, res) { 
    let body = req.body.body; 
    decode(body, function(result) { 
     res.json(result); 
    }); 

    function decode(cert) { 
     let file = randCertFileName(); // Get a random filename for out cert 
     var result; 
     fs.writeFile(file, cert, function(err) { // Write the cert to a file 

      if (err) { 
       console.error("Error writing certificate: " + error); 
       throw err; 
      } else { 
       execute('certutil -dump ' + file, function(out) { // Execute the certutil dump command 
        //console.log(out); 
        result = out; 
        fs.unlink(file); // Delete the certificate file 

        //return result; 

       }); 
      } 
     }); 

    } 
}); 

Как я уже сказал, если я делаю console.log(out) я могу получить дамп, но не иначе. Я тратил много сообщений SO, и из того, что я вижу, я думаю, что правильно выполняю вызов AJAX, поэтому проблема, вероятно, в моей конечной точке.

Заранее благодарен!

+1

попытаться дать 'decode' обратного вызова в качестве второго параметра функции, и вызов callback, где console.log (out) с результатом в качестве входного параметра – fzxt

ответ

1

В конечной точке nodejs вы вызываете функцию decode с двумя аргументами, сначала тело, затем обратный вызов. Но ваше объявление функции принимает только один аргумент. Вы должны изменить это и не забывайте всегда возвращать функцию обратного вызова:

function decode(cert, callback) { 
    let file = randCertFileName(); 
    var result; 
    fs.writeFile(file, cert, function(err) { 
     if (err) { 
      console.error("Error writing certificate: " + error); 
      return callback(err); 
     } 

     execute('certutil -dump ' + file, function(out) { 
      result = out; 
      fs.unlink(file); 

      return callback(null, result); // first argument is err 
     }); 
    }); 
} 

теперь, вы можете получить свой результат:

.post(function(req, res) { 
    const body = req.body.body; 
    decode(body, function(err, result) { // don't forget the two arguments, 
             // first error, then result. 
     if (err) 
      throw err; 
     res.json(result); 
    }); 
}); 
Смежные вопросы