Как разбить входящий http-запрос в Node.js для индивидуальной обработки объекта json - PullRequest
0 голосов
/ 10 мая 2019

Я работаю со сценарием обработки данных, в котором входящие данные принимаются в концентраторе IoT Azure, обрабатываются с использованием потоковой аналитики Azure и отправляются (триггер http) в функцию Azure: https://github.com/Azure/iotc-device-bridge, записанный в Node.js.Цель здесь - разбить входящие данные и обработать объекты асинхронно.Входящие данные представляют собой массив объектов json.

Я пытался перебрать req.body, чтобы разбить его на разные объекты, но это не сработало.

Спасибо за помощь!

Входящее сообщение для функции:

     [{
     "device": {
     "deviceId": "my-cloud-device"
     },
     "measurements": {
     "temp": 20.31,
     "pressure": 50,
     "humidity": 8.5,
     "ledColor": "blue"
     }
     },
     {
     "device": {
     "deviceId": "my-cloud-device"
     },
     "measurements": {
     "temp": 20.31,
     "pressure": 50,
     "humidity": 8.5,
     "ledColor": "blue"
     }
     }]

Код, обрабатывающий входящие данные

const request = require('request-promise-native');
const handleMessage = require('./lib/engine');
const bodyParser = require('body-parser');

const msiEndpoint = process.env.MSI_ENDPOINT;
const msiSecret = process.env.MSI_SECRET;

const parameters = {
idScope: process.env.ID_SCOPE,
primaryKeyUrl: process.env.IOTC_KEY_URL
};

let kvToken;

module.exports = async function (context, req) {
try {

    await handleMessage({ ...parameters, log: context.log, getSecret:    getKeyVaultSecret }, req.body.device, req.body.measurements, req.body.timestamp);

} catch (e) {
    context.log('[ERROR]', e.message);

    context.res = {
        status: e.statusCode ? e.statusCode : 500,
        body: e.message
    };
}
console.log(b);

}

Что я ожидаю сделать, так это разбить входящее сообщение на другой объект, который обрабатывается асинхронно с использованием приведенного выше блока кода.

 {
 "device": {
 "deviceId": "my-cloud-device"
 },
 "measurements": {
 "temp": 20.31,
 "pressure": 50,
 "humidity": 8.5,
 "ledColor": "blue"
 }
 }

 {
 "device": {
 "deviceId": "my-cloud-device"
 },
 "measurements": {
 "temp": 20.31,
 "pressure": 50,
 "humidity": 8.5,
 "ledColor": "blue"
 }
 }

1 Ответ

1 голос
/ 13 мая 2019

Я предполагаю, handleMessage только для одного объекта.В таком случае вам придется перебрать req.body для доступа к каждому из них.Не могли бы вы поделиться тем, что вы пытались, а что не работало раньше?

Ваш код должен выглядеть примерно так:

///

module.exports = async function (context, req) {
let commonArgs = { ...parameters, log: context.log, getSecret:    getKeyVaultSecret };
let promiseList = [];

try {
  for (let dev of req.body) {
      promiseList.add(handleMessage(commonArgs, dev.device, dev.measurements, dev.timestamp));
  }

  await Promise.all(promiseList); // This way is much better but you could also await each call too

} catch (e) {

///

Я не вижу в ваших данных свойства timestamp.Может быть, вы удалили его?

Кроме того, для гораздо лучшего масштаба вам, возможно, придется проверить Durable Functions , в частности шаблон Fan Out / Fan In .

При этом вы переместитесь handleMessage в функцию активности, которая будет масштабироваться с вашей нагрузкой.

...