Apache Camel - Node.js的问题

时间:2013-04-07 20:31:22

标签: apache node.js apache-camel

所以我在一段代码中有100个不同的错误。我最近从Apache和PHP切换到Node.js.我有一段特殊的代码,只是复制了它收到的请求。基本上,我的Web应用程序向我的服务器(PHP或Node.js)发布JSON请求,然后服务器将完全相同的请求发送到我的Apache Camel配置。在PHP中,这非常有效。当切换到Node.js时,我从Apache Camel那里得到错误。

具体来说,我有一段代码几乎瞬间发送完全相同的请求两次(我知道如何解决它,只是忍受我)。在PHP中,此代码可以正常工作。在Node.js中,第一个请求正常,但第二个请求失败。 Apache Camel第二次收到空体的请求。说实话,我100%无能为力。

这里到底出了什么问题? Logic告诉我,如果它适用于PHP而不是Node(相同的Camel代码),那么它必须是Node.js的一个问题。但是为了以防万一,我不得不提到Camel,因为Camel有时会提出一些奇怪的事情。

我将在下面发布我的代码,也许你可以看到一个问题。我已经在这3天(打开和关闭)工作,但还没有发现问题。另外,请记住我几天前刚开始使用节点。

PHP

<?php
    require_once("globals.php");

    //There's nested JSON here so I could include the destination address
    $request = file_get_contents('php://input');
    $json = json_decode($request);
    $urlid = $json->{"urlid"};
    $json = $json->{"data"};

    if (session_start() === FALSE)
    {
        echo "{ \"postsuccess\": false, \"error\": -1 }";
        return;
    }

    if(!isset($_SESSION["username"]) ||
            !isset($_SESSION["expirationdate"]) ||
            !isset($_SESSION["securitytoken"]) ||
            $_SESSION["expirationdate"] <= time())
    {
        echo "{ \"postsuccess\": false, \"error\": -2 }";
        return;
    }

    if(strtolower($_SESSION["username"]) != strtolower($_COOKIE["UserNameCookie"]))
    {
        echo "{ \"postsuccess\": false, \"error\": -3 }";
        return;
    }

    $json->{"securitytoken"} = strtolower($_SESSION["securitytoken"]);
    $json->{"username"} = strtolower($_SESSION["username"]);
    $request = json_encode($json);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $URL[$urlid]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/plain; charset=utf-8"));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);

    $data = curl_exec($ch);
    curl_close($ch);

    echo $data;
?>

Node.js(Typescript)

function handler(request: ExpressServerRequest, response: ExpressServerResponse) {
    try {
        var json = (request.body || JSON.parse(request.rawBody));
        var security_token = request.cookies.get(global.security_token_cookie, {signed: true});
        var username = request.cookies.get(global.username_cookie, {signed: true});
        var urlid = json.urlid;
        json = json.data;

        if (!security_token || !username) {
            response.send({postsuccess: false, error: -2});
            return;
        }

        json.securitytoken = security_token;
        json.username = username;

        var callback = function(data) {
            response.json(data);
        };

        db.databaseRequest(urlid, json, callback);
    } catch (e) {
        console.error(e.stack);
        response.send({postsuccess: false, error: -1});
    }
}

//Was in a different module
function databaseRequest(url: number, data: any, callback: (any) => void) {
    try {
        var json = JSON.stringify(data);

        var headers = {
            "Content-Type": "application/json",
            "Content-Length": json.length
        };

        var options = {
            host: db_host,
            port: db_port,
            path: url_locations[url],
            headers: headers,
            method: "POST"
        };

        var request = http.request(options, function(response) {
            response.setEncoding("utf8");

            var returnData = "";

            response.on("data", function(d) {
                returnData += d;
            });

            response.on("end", function() {
                if (returnData) {
                    callback(JSON.parse(returnData));
                } else {
                    callback(null);
                }
            });
        });

        request.on("error", function(e) {
            console.error("Error posting database request:");
            console.error("Location: " + url_locations[url]);
            console.error("Data: " + json);
            console.error("Error Event: " + e);
        });

        request.write(json);
        console.log("Sending: " + json + " to " + url_locations[url]);
        request.end();
    } catch (e) {
        console.error(e.stack);
        request.end();
        callback({ "dberror" : true });
    }
}

1 个答案:

答案 0 :(得分:4)

编辑:

我要保持更新,但我真的怀疑任何人,但我会遇到这个问题。 :/

我找到了问题的根源。结果证明这是一个并发问题。 PHP以线性方式提交请求,而Node.js是非阻塞的,因此它会在其他人返回之前发送请求。从本质上讲,我愚蠢到将状态信息存储在处理器中。我的路线看起来像这样:

from("jetty:http://foo").process(new WorkProcessor()).to("direct:foo2");

我最初的想法是“好的,每次触发路由时都会创建一个新的WorkProcessor,因此每条消息都会获得自己的小沙箱”。不幸的是,事实并非如此,它只创造了一次。我不知道为什么我会这么想,但我做到了。 :(

所以我通过不在处理器实例中存储信息来解决问题。它使我的代码更长一点,但它解决了我的问题。