将会话从PHP转换为NodeJS-JSON输入意外结束
我试图通过JSON数据传递变量,将PHP会话转换为NodeJS会话,但我得到了一个错误。PHP和NodeJS之间是否还有其他会话可以共享?PHP包含会话,节点将从PHP获取会话将会话从PHP转换为NodeJS-JSON输入意外结束,php,node.js,session,Php,Node.js,Session,我试图通过JSON数据传递变量,将PHP会话转换为NodeJS会话,但我得到了一个错误。PHP和NodeJS之间是否还有其他会话可以共享?PHP包含会话,节点将从PHP获取会话 http.get("http://localhost/sapapplication/php_application/php/ session_node.php", res => { const { statusCode } = res; const contentType
http.get("http://localhost/sapapplication/php_application/php/
session_node.php", res => {
const { statusCode } = res;
const contentType = res.headers["content-type"];
let error;
if (statusCode !== 200) {
error = new Error("Request Failed.\n" + `Status Code: ${statusCode}`);
}
if (error) {
console.error(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding("utf8");
let rawData = "";
res.on("data", chunk => {
rawData += chunk;
console.error('--->',chunk);
});
res.on("end", () => {
try {
const parsedData = JSON.parse(rawData);
req.session.user = parsedData;
resp.json(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on("error", e => {
console.error(`Got error: ${e.message}`);
next(e);
});
这是php页面输出:{“id”:“1”,“用户名”:“jon”}
http.get("http://localhost/sapapplication/php_application/php/
session_node.php", res => {
const { statusCode } = res;
const contentType = res.headers["content-type"];
let error;
if (statusCode !== 200) {
error = new Error("Request Failed.\n" + `Status Code: ${statusCode}`);
}
if (error) {
console.error(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding("utf8");
let rawData = "";
res.on("data", chunk => {
rawData += chunk;
console.error('--->',chunk);
});
res.on("end", () => {
try {
const parsedData = JSON.parse(rawData);
req.session.user = parsedData;
resp.json(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on("error", e => {
console.error(`Got error: ${e.message}`);
next(e);
});
获取此错误:JSON输入意外结束
http.get("http://localhost/sapapplication/php_application/php/
session_node.php", res => {
const { statusCode } = res;
const contentType = res.headers["content-type"];
let error;
if (statusCode !== 200) {
error = new Error("Request Failed.\n" + `Status Code: ${statusCode}`);
}
if (error) {
console.error(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding("utf8");
let rawData = "";
res.on("data", chunk => {
rawData += chunk;
console.error('--->',chunk);
});
res.on("end", () => {
try {
const parsedData = JSON.parse(rawData);
req.session.user = parsedData;
resp.json(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on("error", e => {
console.error(`Got error: ${e.message}`);
next(e);
});
我的PHP
<?php
session_start();
include 'db.php';
$respose["session"]=array();
if (isset($_SESSION['userid']))
{
$respose["session"] = array(
'id'=> $_SESSION['id'],
'username'=> $_SESSION['username']
);
echo json_encode($respose["session"]);
}
?>
http.get("http://localhost/sapapplication/php_application/php/
session_node.php", res => {
const { statusCode } = res;
const contentType = res.headers["content-type"];
let error;
if (statusCode !== 200) {
error = new Error("Request Failed.\n" + `Status Code: ${statusCode}`);
}
if (error) {
console.error(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding("utf8");
let rawData = "";
res.on("data", chunk => {
rawData += chunk;
console.error('--->',chunk);
});
res.on("end", () => {
try {
const parsedData = JSON.parse(rawData);
req.session.user = parsedData;
resp.json(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on("error", e => {
console.error(`Got error: ${e.message}`);
next(e);
});
正如我在评论中提到的,
$\u SESSION['userid']
没有为Node.JS
请求设置,因此您会收到该错误,因为在这种情况下,您的端点不会生成任何输出。原因是您的会话ID cookie是在浏览器中设置的,因此不会在Node.JS
请求中发送<此实例中的code>Node.JS无法单独获取会话,因为它没有该ID
http.get("http://localhost/sapapplication/php_application/php/
session_node.php", res => {
const { statusCode } = res;
const contentType = res.headers["content-type"];
let error;
if (statusCode !== 200) {
error = new Error("Request Failed.\n" + `Status Code: ${statusCode}`);
}
if (error) {
console.error(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding("utf8");
let rawData = "";
res.on("data", chunk => {
rawData += chunk;
console.error('--->',chunk);
});
res.on("end", () => {
try {
const parsedData = JSON.parse(rawData);
req.session.user = parsedData;
resp.json(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on("error", e => {
console.error(`Got error: ${e.message}`);
next(e);
});
我想到了几个不同的场景。我不确定哪一个(如果有的话)适合您的情况,而且我对node也不太熟悉,因此这些将或多或少是一个概括性的概述:
http.get("http://localhost/sapapplication/php_application/php/
session_node.php", res => {
const { statusCode } = res;
const contentType = res.headers["content-type"];
let error;
if (statusCode !== 200) {
error = new Error("Request Failed.\n" + `Status Code: ${statusCode}`);
}
if (error) {
console.error(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding("utf8");
let rawData = "";
res.on("data", chunk => {
rawData += chunk;
console.error('--->',chunk);
});
res.on("end", () => {
try {
const parsedData = JSON.parse(rawData);
req.session.user = parsedData;
resp.json(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on("error", e => {
console.error(`Got error: ${e.message}`);
next(e);
});
场景1)节点和PHP位于同一个域中,都可以通过浏览器访问。(通过AJAX或普通页面。)
http.get("http://localhost/sapapplication/php_application/php/
session_node.php", res => {
const { statusCode } = res;
const contentType = res.headers["content-type"];
let error;
if (statusCode !== 200) {
error = new Error("Request Failed.\n" + `Status Code: ${statusCode}`);
}
if (error) {
console.error(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding("utf8");
let rawData = "";
res.on("data", chunk => {
rawData += chunk;
console.error('--->',chunk);
});
res.on("end", () => {
try {
const parsedData = JSON.parse(rawData);
req.session.user = parsedData;
resp.json(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on("error", e => {
console.error(`Got error: ${e.message}`);
next(e);
});
如果您使用浏览器访问Node.JS
实例,并且该实例与PHP脚本位于同一来源,则可以获取浏览器可能已经传递的会话ID cookie,然后将其包含在nodejs HTTP请求中。(不幸的是,我对node了解不够,无法提供太多关于如何做到这一点的信息。我假设cookies npm包会很有用。)一旦您从浏览器的cookie中获得会话ID,您可以将其包含在节点请求中,PHP应该以您期望的方式响应
http.get("http://localhost/sapapplication/php_application/php/
session_node.php", res => {
const { statusCode } = res;
const contentType = res.headers["content-type"];
let error;
if (statusCode !== 200) {
error = new Error("Request Failed.\n" + `Status Code: ${statusCode}`);
}
if (error) {
console.error(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding("utf8");
let rawData = "";
res.on("data", chunk => {
rawData += chunk;
console.error('--->',chunk);
});
res.on("end", () => {
try {
const parsedData = JSON.parse(rawData);
req.session.user = parsedData;
resp.json(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on("error", e => {
console.error(`Got error: ${e.message}`);
next(e);
});
场景2)节点由浏览器访问(AJAX或完整页面),但位于不同的域中
http.get("http://localhost/sapapplication/php_application/php/
session_node.php", res => {
const { statusCode } = res;
const contentType = res.headers["content-type"];
let error;
if (statusCode !== 200) {
error = new Error("Request Failed.\n" + `Status Code: ${statusCode}`);
}
if (error) {
console.error(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding("utf8");
let rawData = "";
res.on("data", chunk => {
rawData += chunk;
console.error('--->',chunk);
});
res.on("end", () => {
try {
const parsedData = JSON.parse(rawData);
req.session.user = parsedData;
resp.json(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on("error", e => {
console.error(`Got error: ${e.message}`);
next(e);
});
在这种情况下,您可以在每个请求中传递相关数据,或者尝试在浏览器中设置会话ID,然后在节点http请求中使用该ID。我认为前者对我来说更容易。但是,在两者之间同步会话ID应该不是不可能的。基本上,您需要将会话ID发送到节点(可能通过查询字符串或使用特殊的页面POST请求),并让节点为其域设置一个类似的cookie,然后您可以传递HTTP请求。注意:您必须确保它们保持同步
http.get("http://localhost/sapapplication/php_application/php/
session_node.php", res => {
const { statusCode } = res;
const contentType = res.headers["content-type"];
let error;
if (statusCode !== 200) {
error = new Error("Request Failed.\n" + `Status Code: ${statusCode}`);
}
if (error) {
console.error(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding("utf8");
let rawData = "";
res.on("data", chunk => {
rawData += chunk;
console.error('--->',chunk);
});
res.on("end", () => {
try {
const parsedData = JSON.parse(rawData);
req.session.user = parsedData;
resp.json(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on("error", e => {
console.error(`Got error: ${e.message}`);
next(e);
});
场景3)节点是浏览器无法直接访问的后端服务
http.get("http://localhost/sapapplication/php_application/php/
session_node.php", res => {
const { statusCode } = res;
const contentType = res.headers["content-type"];
let error;
if (statusCode !== 200) {
error = new Error("Request Failed.\n" + `Status Code: ${statusCode}`);
}
if (error) {
console.error(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding("utf8");
let rawData = "";
res.on("data", chunk => {
rawData += chunk;
console.error('--->',chunk);
});
res.on("end", () => {
try {
const parsedData = JSON.parse(rawData);
req.session.user = parsedData;
resp.json(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on("error", e => {
console.error(`Got error: ${e.message}`);
next(e);
});
在本例中,只要让PHP使用必要的会话信息向node发出请求,并基本上将node用作RESTful API服务,就会容易得多
http.get("http://localhost/sapapplication/php_application/php/
session_node.php", res => {
const { statusCode } = res;
const contentType = res.headers["content-type"];
let error;
if (statusCode !== 200) {
error = new Error("Request Failed.\n" + `Status Code: ${statusCode}`);
}
if (error) {
console.error(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding("utf8");
let rawData = "";
res.on("data", chunk => {
rawData += chunk;
console.error('--->',chunk);
});
res.on("end", () => {
try {
const parsedData = JSON.parse(rawData);
req.session.user = parsedData;
resp.json(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on("error", e => {
console.error(`Got error: ${e.message}`);
next(e);
});
场景4)节点是浏览器无法直接访问的后端服务,但节点进程运行时间很长,因此您无法切实等待节点的响应
http.get("http://localhost/sapapplication/php_application/php/
session_node.php", res => {
const { statusCode } = res;
const contentType = res.headers["content-type"];
let error;
if (statusCode !== 200) {
error = new Error("Request Failed.\n" + `Status Code: ${statusCode}`);
}
if (error) {
console.error(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding("utf8");
let rawData = "";
res.on("data", chunk => {
rawData += chunk;
console.error('--->',chunk);
});
res.on("end", () => {
try {
const parsedData = JSON.parse(rawData);
req.session.user = parsedData;
resp.json(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on("error", e => {
console.error(`Got error: ${e.message}`);
next(e);
});
如果节点运行的进程是长时间运行的进程(即,您不能等待PHP中的完整响应),您可以使用与场景3相同的方式使用节点,并使用此理论API对作业进行排队并返回作业ID。在队列中记录作业的会话信息,并在后台处理队列。使用作业ID来跟踪它。您得到的错误可能是因为$\u会话['userid']可能没有为Node.JS的会话设置。因为它没有设置,所以您不会输出任何内容,因此会出现错误。您可以添加一些关于您尝试执行的操作的详细信息吗?您是否正在尝试将用户的会话信息传递到Node.JS?或者Node.JS是否登录并管理自己的会话?我刚刚意识到,如果您没有这一点信息,响应可能听起来很混乱:我问的原因是会话(通常)由cookie标识。由于Node.JS的请求机制没有用户的cookie,因此它不会得到与浏览器相同的响应。当然,除非Node.JS是客户端本身。有更多关于你要做什么的信息可能会得到更好的答案。
http.get("http://localhost/sapapplication/php_application/php/
session_node.php", res => {
const { statusCode } = res;
const contentType = res.headers["content-type"];
let error;
if (statusCode !== 200) {
error = new Error("Request Failed.\n" + `Status Code: ${statusCode}`);
}
if (error) {
console.error(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding("utf8");
let rawData = "";
res.on("data", chunk => {
rawData += chunk;
console.error('--->',chunk);
});
res.on("end", () => {
try {
const parsedData = JSON.parse(rawData);
req.session.user = parsedData;
resp.json(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on("error", e => {
console.error(`Got error: ${e.message}`);
next(e);
});