如何从 NodeJS 端点获取 jQuery AJAX 结果?

How to get jQuery AJAX result from NodeJS endpoint?

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

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 端点:

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

提前致谢!

在您的 nodejs 端点中,您使用两个参数调用 decode 函数,首先是主体,然后是回调。但是你的函数声明只接受一个参数。你必须改变它并且不要忘记总是 return 回调 :

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);
    });
 });