将会话从PHP转换为NodeJS-JSON输入意外结束

将会话从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

我试图通过JSON数据传递变量,将PHP会话转换为NodeJS会话,但我得到了一个错误。PHP和NodeJS之间是否还有其他会话可以共享?PHP包含会话,节点将从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);
    });
这是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);
    });