Редактирование 2: Выпуск 1.15.2 модуля анализатора тела вводит режим raw mode , который возвращает тело в качестве буфера . По умолчанию он также автоматически обрабатывает дефляцию дефляции и gzip. Пример использования:
var bodyParser = require('body-parser');
app.use(bodyParser.raw(options));
app.get(path, function(req, res) {
// req.body is a Buffer object
});
По умолчанию объект options
имеет следующие параметры по умолчанию:
var options = {
inflate: true,
limit: '100kb',
type: 'application/octet-stream'
};
Если вы хотите, чтобы ваш сырой парсер разбирал другие типы MIME, кроме application/octet-stream
, вам нужно будет изменить его здесь. Он также поддерживает подстановочные знаки, такие как */*
или */application
.
Примечание: Следующий ответ для версий до Express 4, где промежуточное программное обеспечение все еще в комплекте с каркасом. Современным эквивалентом является модуль body-parser , который должен быть установлен отдельно.
Свойство rawBody
в Express было когда-то доступно, но было удалено с версии 1.5.1. Чтобы получить необработанное тело запроса, перед использованием bodyParser вы должны установить промежуточное программное обеспечение. Вы также можете прочитать обсуждение GitHub об этом здесь .
app.use(function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
req.on('end', function() {
next();
});
});
app.use(express.bodyParser());
Это промежуточное ПО будет считываться из фактического потока данных и хранить его в свойстве rawBody
запроса , Затем вы можете получить доступ к необработанному телу следующим образом:
app.post('/', function(req, res) {
// do something with req.rawBody
// use req.body for the parsed body
});
Изменить: кажется, что этот метод и bodyParser отказываются сосуществовать, потому что один будет потреблять поток запросов перед другим, что приведет к тому, что второе никогда не стрелять end
, тем самым никогда не вызывая next()
и не вися на вашем приложении.
Самое простое решение, скорее всего, будет изменить источник bodyParser, который вы найдете на линии 57 анализатора JSON от Connect. Это будет измененная версия.
var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk){ buf += chunk });
req.on('end', function() {
req.rawBody = buf;
var first = buf.trim()[0];
...
});
Вы найдете файл в этом месте:
/node_modules/express/node_modules/connect/lib/middleware/json.js
.
По вашему вопросу я узнал, что вы работаете с большим количеством данных. Мне не ясно, о какой проблеме конфигурации вашей системы вы упоминали. Я думаю, что ваша конфигурация в порядке. В этой ситуации
я думаю, вы можете подумать о следующих подходах.
1. Use sub process(Thread) or background worker to retrieve data from database with
your Main UI Thread.
2.Optimize database connection string by creating a single instance, which has been
opened and closed several time in your code.