Большие строки (например, data dataURL) не полностью передаются от клиента к серверу методом POST в Node - PullRequest
0 голосов
/ 01 мая 2020

Я работаю над приложением чата, используя Node+JS на локальном хосте, и его структура выглядит следующим образом:

- index.js (server-side)
- style.css
- script.js (client-side)
- chats.txt (file to store text)
- bin (folder to store images)
- index.html

Я не знаю, куда загрузить эти полные стеки приложения, поэтому я загрузил весь проект здесь: https://repl.it/@RahulVerma8 / BlogApp .

Repl не так полезен, как можно подумать, за исключением ссылки на код. Я предлагаю скопировать его локально и запустить на локальном хосте, чтобы почувствовать проект. В любом случае, следующее описание:

В этом проекте мы предлагаем пользователю общаться в чате, используя текст + изображение. Текстовая часть работает нормально, проблема с изображением. Сначала вводится файл, который обрабатывает изображения (строка: 160-173, script. js), затем мы подготавливаем и отправляем строку запроса на сервер (строка: 117-132, script. js). Там у нас был консольный журнал, который записывает длину строки запроса (строка №: 128, скрипт. js). На этом этапе задача на стороне клиента завершена.

Теперь у нас есть Node-сервер, который захватывает строку запроса (строка №: 27,28,29 на сервере. js). У меня здесь проблема в том, что клиент и сервер регистрируют разную длину одной и той же строки запроса. Я знаю, что сторона клиента не может ошибаться, поскольку она генерирует строку. Я сомневаюсь, что сервер не полностью захватывает строку, так как:

  • он выводит клиенту разную длину
  • он выводит разную длину каждый раз вместо уникальный

Почему возникает эта проблема? Есть идеи?

1 Ответ

0 голосов
/ 01 мая 2020

Я понял, почему это происходит. Это узел bcoz получает большие запросы данных в чанках , и поэтому я получил частичные JSON данные , и ошибка узла вызвала.

В целях тестирования можно проверить следующий код на локальном хосте:

  • index. js
let http = require('http'),
    fs = require('fs');

http.createServer((req, resp) => {
  if(req.method === 'GET' && req.url === '/') {
    fs.readFile('./index.html', (err, res) => {
      resp.writeHead('200', { 'Content-Type': 'text/html' });
      resp.end(res, 'utf8');
    });
  } else if(req.method === 'POST') req.on( 'data', chunk => console.log('Length', chunk.length) );
}).listen(8080);
  • index. html
<input type="file" accept="image/*" onchange="f(this);">
<script>
function f(el) {
    var fr = new FileReader();
    fr.onload = function() {
        console.log('Length', fr.result.length);
        var xhr = new XMLHttpRequest();
        xhr.open('POST', '/', true);
        xhr.send(fr.result);
    };
    fr.readAsDataURL(el.files[0]);
};
</script>

Удобное решение

Напишите что-то вроде

let chunk = '';
req.on('data', _chunk => chunk += _chunk).on('end', () => {
  // do something with chunk
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...