所以我在一段代码中有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 });
}
}
答案 0 :(得分:4)
编辑:
我要保持更新,但我真的怀疑任何人,但我会遇到这个问题。 :/
我找到了问题的根源。结果证明这是一个并发问题。 PHP以线性方式提交请求,而Node.js是非阻塞的,因此它会在其他人返回之前发送请求。从本质上讲,我愚蠢到将状态信息存储在处理器中。我的路线看起来像这样:
from("jetty:http://foo").process(new WorkProcessor()).to("direct:foo2");
我最初的想法是“好的,每次触发路由时都会创建一个新的WorkProcessor
,因此每条消息都会获得自己的小沙箱”。不幸的是,事实并非如此,它只创造了一次。我不知道为什么我会这么想,但我做到了。 :(
所以我通过不在处理器实例中存储信息来解决问题。它使我的代码更长一点,但它解决了我的问题。