【问题标题】:Convert session from PHP to NodeJS - Unexpected end of JSON input将会话从 PHP 转换为 NodeJS - JSON 输入意外结束
【发布时间】:2018-11-19 23:43:18
【问题描述】:

我正在尝试通过 JSON 数据传递变量来将 PHP 会话转换为 NodeJS 会话,但出现错误。还有其他任何可以在 PHP 和 NodeJS 之间共享会话吗? PHP 包含会话,Node 将从 PHP 获取会话。

这是php页面输出:{"id":"1","username":"jon"}

收到此错误:Unexpected end of JSON input

我的 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"]);

 }

 ?>

我的 NodeJS

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

【问题讨论】:

  • 您得到的错误可能是因为 $_SESSION['userid'] 可能没有为 Node.JS 的会话设置。由于未设置,因此您不会输出任何内容,因此会出现该错误。
  • 你能添加更多关于你想要做什么的细节吗?您是否尝试将用户的会话信息传递给 Node.JS?还是 Node.JS 登录并管理它自己的会话?
  • 我刚刚意识到,如果您没有这些信息,响应可能听起来令人困惑:我问的原因是会话(通常)由 cookie 标识。由于 Node.JS 的请求机制没有用户的 cookie,因此它不会得到与浏览器相同的响应。当然,除非 Node.JS 是客户端本身。了解更多有关您正在尝试做的事情的信息可能会为您提供更好的答案。
  • 我正在尝试在节点 js 中使用 php 会话。

标签: php node.js session


【解决方案1】:

正如我在评论中提到的,$_SESSION['userid'] 没有为 Node.JS 请求设置,因此您会收到该错误,因为您的端点在这种情况下不会产生任何输出。原因是您的会话 ID cookie 是在您的浏览器中设置的,因此不会在 Node.JS 请求中发送。 Node.JS 在这种情况下无法自行获取会话,因为它没有那个 ID。

我想到了几种不同的场景。我不确定哪个(如果有的话)适合你的情况,而且我对节点不是很熟悉,所以这些或多或少是广泛的概述:

场景 1) 节点和 PHP 在同一个域中,并且都使用浏览器访问。 (通过 AJAX 或普通页面。)

如果您使用浏览器访问您的 Node.JS 实例,并且它与您的 PHP 脚本位于同一来源,您可以获取您的浏览器可能已经传递的会话 ID cookie,然后将其包含在您的 nodejs HTTP 请求中. (不幸的是,我对节点的了解不够多,无法提供有关如何执行此操作的太多信息。我认为 cookies npm 包会很有用。)一旦您从浏览器的 cookie 中获得会话 ID,您就可以将其包含在您的节点中请求和 PHP 应该按照您期望的方式响应。

场景 2) 节点被浏览器访问(AJAX 或整页),但位于不同的域中

在这种情况下,您可以在每个请求中传递相关数据,或者尝试在浏览器中设置一个会话 ID,然后您可以在节点 http 请求中使用该会话 ID。我认为前者更容易我自己。但是,在两者之间同步会话 ID 应该不是不可能的。您基本上将会话 ID 发送到节点(可能通过查询字符串或特殊的页面 POST 请求)并让节点为其域设置类似的 cookie,然后您可以将其传递给您的 HTTP 请求。注意:您必须确保它们保持同步。

场景 3) 节点是浏览器不直接访问的后端服务

在这种情况下,让 PHP 使用必要的会话信息向节点发出请求会容易得多,并且基本上将节点用作 RESTful API 服务。

场景 4) 节点是后端服务,浏览器不直接访问,但节点进程运行时间长,因此您无法等待节点的响应

如果节点运行的进程是长时间运行的(即您不能等待 PHP 中的完整响应),您可以使用与场景 3 相同的方式使用节点,并使用此理论 API 来排队作业并返回一个作业 ID。在您的作业队列中记录会话信息并在后台处理队列。使用作业 ID 对其进行跟踪。

【讨论】:

    猜你喜欢
    • 2013-11-20
    • 1970-01-01
    • 2020-07-10
    • 2023-03-15
    • 2015-08-05
    • 2019-02-14
    • 2015-03-15
    • 2018-05-15
    • 2021-10-03
    相关资源
    最近更新 更多