0

我成功地对我设置的端点进行了 ajax 调用。我将原始证书作为 JSON 发送给它,后端对其进行解码。现在,我可以用 a 调出解码结果,console.log但我不知道如何将其作为结果返回。

阿贾克斯调用:

    $("#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 端点:

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 调用,所以问题可能出在我的端点上。

提前致谢!

4

1 回答 1

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);
    });
 });
于 2016-06-14T08:21:44.247 回答