Конвертировать сеанс из PHP в NodeJS - неожиданный конец ввода JSON - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь преобразовать сеанс PHP в сеанс NodeJS, передав переменные через данные JSON, но получаю ошибку.Есть ли еще что-нибудь, чтобы разделить сеанс между 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"]);

 }

 ?>

Мой узел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);
    });

1 Ответ

0 голосов
/ 22 июня 2018

Как упомянуто в моем комментарии, $_SESSION['userid'] не установлено для запроса Node.JS, поэтому вы получаете эту ошибку, потому что ваша конечная точка в этом случае не производит никакого вывода.Причина этого в том, что ваш cookie-файл идентификатора сеанса установлен в вашем браузере и поэтому не будет отправлен в запросе Node.JS.Node.JS в этом случае не может получить сеанс самостоятельно, потому что у него нет этого идентификатора.

Есть несколько различных сценариев, которые приходят на ум.Я не совсем уверен, какой (если таковой имеется) подойдет для вашего случая, и я не очень знаком с узлом, поэтому это будут более или менее широкие обзоры:

Сценарий 1) узел и PHP находятся в одном домене и доступны через браузер.(либо через AJAX, либо через обычные страницы.)

Если вы обращаетесь к своему экземпляру Node.JS через браузер, и он находится в том же источнике, что и ваши PHP-скрипты, вы можете взять куки-файл идентификатора сессии, скорее всего, ваш браузеруже проходит, а затем включите его в ваш HTTP-запрос nodejs.(К сожалению, я не знаю достаточно об узле, чтобы многое рассказать о том, как это сделать. Я предполагаю, что пакет cookie npm будет полезен.) Получив идентификатор сеанса из файла cookie браузера, вы можете включить его в свой узел.запросы и PHP должны отвечать так, как вы ожидаете.

Сценарий 2) узел доступен браузером (AJAX или полные страницы), но находится в другом домене

В этом сценарии вы должны либо передавать соответствующие данные при каждом запросе, либо ИЛИ пытаться получить идентификатор сеанса, установленный в браузере, который затем можно будет использовать в запросе http вашего узла.Я думаю, что первый легче сам.Однако синхронизация идентификатора сеанса между ними не должна быть невозможной.Вы в основном отправляете идентификатор сеанса на узел (возможно, через строку запроса или с помощью специального запроса POST на странице), и узел устанавливает аналогичный файл cookie для своего домена, который затем можно передавать в HTTP-запросах.Примечание. Необходимо убедиться, что они остались синхронизированными.

Сценарий 3) узел - это бэкэнд-служба, к которой браузер напрямую не обращается

В этом случаебыло бы намного проще просто сделать так, чтобы PHP делал запросы к узлу с необходимой информацией о сеансе, и в основном использовал узел в качестве службы API RESTful.

Сценарий 4) узел - это бэкэнд-сервис, к которому браузер напрямую не обращается, но процессы узла работают долго, поэтому вы не можете ожидать ответа от узла

* 1033.* Если процессы, выполняемые узлом, являются долгосрочными (то есть вы не можете ждать полного ответа в PHP), вы можете использовать узел так же, как в сценарии 3, и использовать этот теоретический API для постановки задания и возвратаидентификатор работы.Запишите информацию о сеансе в свою очередь для задания и обработайте очередь в фоновом режиме.Используйте идентификатор задания, чтобы отследить его.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...