【问题标题】:How to get jQuery AJAX result from NodeJS endpoint?如何从 NodeJS 端点获取 jQuery AJAX 结果?
【发布时间】:2016-06-14 16:21:44
【问题描述】:

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

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

提前致谢!

【问题讨论】:

  • 尝试给decode一个回调作为第二个函数参数,并调用console.log(out)所在的回调,并将结果作为输入参数

标签: jquery json ajax node.js certutil


【解决方案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);
    });
 });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-27
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多