Intereting Posts
Node.Js / Express – простое промежуточное программное обеспечение для вывода первых нескольких символов ответа Сделать дочерний процесс, порожденный системой (), продолжать работать после того, как родитель получает сигналы об удалении и выходы BabelJs над Heroku: Не удалось найти предустановленное «env» относительно каталога «/ app» Ошибка Node.js https: ошибка: 0906D06C: подпрограммы PEM: PEM_read_bio: нет стартовой строки Создание PDF с цифровой подписью nodejs Приложение Sails.js не обновляет файлы из активов после запуска Проблемы с началом работы с webpack 4 Запуск узлового сервера с помощью webpack-dev-сервера PDF-приложение NodeMailer Как вернуть результаты sqlite3 узла в функцию? Как использовать API-интерфейс Facebook после аутентификации с помощью страtagsи facebook в Passport.js? Каково использование module.parent в node.js? Как я могу обратиться к модулю require ()? Node.js – нужна дампа ядра Как включить связанные объекты в REST с loopback.io Разница между `import from` и` import require` в TypeScript

промежуточное программное обеспечение для сохранения исходных данных сообщения в объекте запроса не будет «дальше» и вызовет таймаут

Мне нужно получить исходные данные для конкретной конечной точки в узле / express-приложении. Я делаю:

app.use('/paypal/ipn',function(req, res, next) { var postData=''; req.on('data', function(chunk) { postData += chunk; }); req.on('end', function() { req.rawBody = postData; console.log('ended buffering. result: ' + req.rawBody); next(); }); }); 

Случается, что я получаю вывод console.log в консоли, а затем ничего не происходит. Через минуту или около того я вижу, что сервер возвращает 200 – возможно, тайм-аут. Это похоже на то, что команда next () никогда не выполняет, не выполняет и не ставляет.

Когда я прокомментирую все и просто позвоню next ():

 app.use('/paypal/ipn',function(req, res, next) { /* var postData=''; req.on('data', function(chunk) { postData += chunk; }); req.on('end', function() { req.rawBody = postData; console.log('ended buffering. result: ' + req.rawBody); next(); }); */ next(); }); 

Все работает, то есть конечная точка называется (конечно, запрос не содержит rawBody).

Так кажется, что я делаю что-то не так, как я буфера rawBody? Что-то, что заставляет next () не работать?

Вызовите next (), не дожидаясь окончания «end», чтобы предотвратить помехи для bodyParser и вашего кода.

 app.use(function(req, res, next) { req.rawBody = ''; req.on('data', function(chunk) { req.rawBody += chunk; }); next(); }); app.use(express.bodyParser()); 

Престижность https://stackoverflow.com/a/21222540/1891397

У меня была аналогичная проблема, проверьте этот код (rawBody):

 /* for some very strange reason, while a IE8/IE9 use a XDomain for CORS requests, express.js bodyParser fail to parse */ app.use(function(req, res, next) { if(req.method !== 'POST') { next(); return; } var data = ''; req.setEncoding('utf8'); req.on('data', function(chunk) { data += chunk; }); req.on('end', function() { req.rawBody = data; req.failSafeBody = queryParser(data); next(); }); }); //se above //app.use(express.bodyParser()); app.use(function(req, res, next){ if(req.method === 'POST' && (!req.body || Object.keys(req.body).length<1) ) { req.body = req.failSafeBody; } next(); }); app.use(express.methodOverride()); 

Простое изменение показало бы, почему следующее не выполняется:

 app.use('/paypal/ipn',function(req, res, next) { var postData=''; req.on('data', function(chunk) { postData += chunk; }); req.on('end', function() { req.rawBody = postData; console.log('ended buffering. result: ' + req.rawBody); console.log(next); }); }); 

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

У меня такие же проблемы. Итак, после того, как Google не нашел хорошего ответа, я потратил больше времени, чтобы исправить это.

Вы должны заметить, что в промежуточном программном обеспечении connect node_module он завершил чтение данных в streamе, когда вы вызываете express.urlencoded (), поэтому я нашел лучший способ исправить эти проблемы:

 app.use(express.urlencoded()); app.use(function(req, res, next){ if (req.method !== 'POST' || JSON.stringify(req.body) !== JSON.stringify({})){ next() return } var data = '' req.on('data', function(chunk){ data += chunk }) req.on('end', function(){ req.rawBody = data next() }) }) 

Как это устроено? Во-первых, мы завершили чтение streamа, вызвав urlencoded (), и мы получили req.body по возвращенной функции.

После этого в функции взлома rawBody мы проверяем, не является ли метод POST (GET?), Или req.body не равен {}, что означает, что обработанные данные urlencoded () прошли успешно, нам не нужно ничего делать (или если вы все еще нужно rawBody в этот момент, вы просто присоединяете () req.body к ‘&’), поэтому мы просто вызываем next () и возвращаем для функции прерывания

(sr мой плохой английский, я действительно хочу поделиться этим опытом, я думаю, вам это понадобится как я;))