Node.js данные формы, отправленные на symfony конечная точка NULL - PullRequest
0 голосов
/ 20 апреля 2020

Через несколько дней go я обнаружил, что размещение данных с помощью «Content-Type»: «application / x- www-form-urlencoded» не позволит мне отправлять такие символы, как ñ, ç, á, é, í, ó, ú и другие не-ASCII, используемые в некоторых языках. Он вернул [ERR_INVALID_CHAR]. ​​

Немного погуглив, я обнаружил, что для публикации больших объемов данных и символов, не входящих в ASCII, мне следует использовать «Content-Type»: «multipart / form-data "(форма, в основном).

Итак, поскольку информация, которую я публикую, не собирается в форме шаблона, мне пришлось создать объект данных формы непосредственно в функции на моем node.js сервере. применение. Вот мой node.js код:

const formData = require('form-data');
const https = require('https');

const form = new formData();
form.append('name', 'ñámeç');

let options = {
    hostname: 'dev.mydomain.com',
    path: '/processdata',
    method: 'POST',
    headers: form.getHeaders()
}

let req = https.request(options, res=>{
    console.log(res.statusCode);
    res.on('data', function(chunk){
        console.log(''+chunk);
    });
    res.on('end', function(){
        console.log('end');
    });
});

req.on('error',function(e){
    console.log(e);
})

form.pipe(req);

Затем в Symfony5 встроен API в dev.mydomain.com/processdata. До моего изменения с «Content-Type»: «application / x- www-form-urlencoded» на «Content-Type»: «multipart / form-data», код был:

public function processdata(Request $request)
{
    // Get post data
    $json = $request->get('json', null);
    // Json decode data
    $guest = json_decode($json);

    ... DO SOME STUFF ...

    $data = "RESULTING STRING";

    return new JsonResponse($data);
}

У меня есть изменил его на:

public function processData(Request $request)
{
    // This is how I expected it would be:
    var_dump($request->request->get('name'));

    // This is just in case it was arriving as GET instead of POST (yes, I'm desperate):
    var_dump($request->query->get('name'));

    //  This is just in case it was arriving as a form object.
    var_dump($request->query->get('form')['name']);

    // This is also a desperate test, but I found some forums pointing this out: 
    var_dump($request->get('name'));

    // Trying to print the request contents:
    print_r($request->request);

    // Since all the $request calls in the var_dumps returned NULL or EMPTY data, I forced the enpoint to return a string to make sure I had a response.

    // Forcing a string for the callback:
    $data = "FORCED RESULTING STRING";

    return new JsonResponse($data);
}

Затем я запускаю мое приложение node.js и выводим:

Claire:Test claire$ node test.js
200
NULL
NULL
NULL
NULL
Symfony\Component\HttpFoundation\ParameterBag Object
(
    [parameters:protected] => Array
        (
        )

)
"FORCED RESULTING STRING"
end

Может кто-нибудь, пожалуйста, спасет меня? Я застрял здесь на пару дней. Все, что я мог прочитать также здесь, в stackoverflow, не относится к моему случаю, или я просто не осознаю разницу.

Если я пропускаю какие-либо данные, вам может понадобиться, чтобы я разъяснил, пожалуйста, дайте мне знать .

Большое спасибо заранее, и я надеюсь, что вы все в безопасности и здоровы.

1 Ответ

0 голосов
/ 21 апреля 2020

Спасибо за ваш ответ, @qdequippe !! Я не был уверен, но вы осветили мой путь!

Я снова проверил form-data npm docs и, очевидно, form.getHeaders() установит только multipart / заголовки данных формы.

Я вспомнил, что для Symfony требуется установить заголовок Content-Length. В противном случае опубликованные данные обнуляются.

Затем я снова попытался использовать form.submit () (я делал это раньше, но, видимо, я не сделал это правильно), и он устанавливает для меня Content-Length. Волшебник c готов:

const formData = require('form-data');
const https = require('https');

const form = new formData();
form.append('name', 'ñámeç');

form.submit('https://dev.mydomain.com/processdata', function(err,res){

    console.log(res.statusCode);
    res.on('data', function(chunk){
        console.log(''+chunk);
    });
    res.on('end', function(){
        console.log('end');
    });
    res.resume();
});

И он возвращает:

Claire:Test claire$ node test.js
200
string(8) "ñámeç"
NULL
NULL
string(8) "ñámeç"
Symfony\Component\HttpFoundation\ParameterBag Object
(
    [parameters:protected] => Array
        (
            [name] => ñámeç
        )

)
"FORCED RESULTING STRING"
end

$ request-> request-> get ('name') перехватывает почтовое поле "name" сейчас.

Я не уверен, как действовать сейчас. Должен ли я отметить свой ответ как действительный? Может быть, вы могли бы создать ответ, чтобы я мог отметить ваш, @qdequippe !!! БОЛЬШОЕ СПАСИБО! Хорошего дня!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...