2016-09-09 2 views
1

kann mir jemand helfen, wie man dieses XML als Ergebnis dieser Funktion zurückgibt?Wie kann ich XML von NodeJS Promise zurückgeben?

Ich brauche die Variable xmlAssinado zurückgegeben werden, wenn ich diese Funktion außerhalb aufrufen.

module.exports = { AssinarXML: function(xml, arquivo, data){ 
certificado.GerarPEM() 
.then(function(pem){ 
    if (pem !== 500){ 
    const transforms = [ 
     'http://www.w3.org/2000/09/xmldsig#enveloped-signature', 
     'http://www.w3.org/TR/2001/REC-xml-c14n-20010315' 
    ]; 
    const infoProvider = (pem) => { 
     return { 
     getKeyInfo() { 
      const cert = this.getCert(); 
      return `<X509Data><X509Certificate>${cert}</X509Certificate></X509Data>`; 
     }, 
     getCert() { 
      const certLines = pem.certificate.split('\n'); 
      return certLines.filter((e, i) => i && e && e.indexOf('-----') !== 0).join(''); 
     } 
     }; 
    }; 

    var signer = new SignedXml(); 
    signer.addReference(`//*[local-name(.)=\'infNFe\']`, transforms); 
    signer.signingKey = new Buffer(pem.key); 
    signer.canonicalizationAlgorithm = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'; 
    signer.keyInfoProvider = infoProvider(pem); 
    signer.computeSignature(xml); 
    **var xmlAssinado = signer.getSignedXml();** 

    fs.writeFile(arquivo + '.xml', xmlAssinado, function(err) { 
     if(err) { 
     console.error("Ocorreu um erro na gravação do arquivo: %s", err); 
     } 
     else { 
     console.log("XML Gerado e Assinado Com Sucesso!"); 
     } 
    }); 
    } else { 
    console.error("Ocorreu na assinatura do arquivo"); 
    } 
})}} 

Was könnte ich tun, um dies zu erreichen?

Antwort

0

Return das Versprechen aus Ihrer Methode so der Anrufer Zugriff auf dieses Versprechen Kette von return Zugabe hier zu bekommen:

return certificado.GerarPEM()... 

Und dann wieder xmlAssinado am Ende Ihres .then() Handler mit:

return xmlAssinado; 

Das wird der xmlAssinado Wert der aufgelöste Wert Ihres Versprechens sein. Sie können dann einen .then() Handler mit dem zurückgegebenen Versprechen verwenden, um den gewünschten aufgelöst Wert, so etwas zu bekommen:

myModule.AssinarXML(...).then(function(xmlAssinado) { 
    // you can use the value here 
}); 

Doing die oben nicht für die fs.writeFile() vor der Lösung zu beenden warten (das in seinem eigenen Tempo fortsetzen wird) . Wenn Sie darauf warten müssen, dass dies abgeschlossen ist, sollten Sie die Operation writeFile ankündigen und diese auch in die Versprechungskette eingliedern, so dass Sie nur dann auflösen können, wenn dies auch geschieht.

Verwandte Themen