簡體   English   中英

如何在Node.js中拆分傳入的HTTP請求以分別處理json對象

[英]How to break up incoming http request in Node.js to process the json object individually

我正在處理一個數據處理方案,其中傳入數據在Azure IoT中心中接收,使用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"
 }
 }

我假設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屬性。 也許您刪除了它?

另外,要獲得更好的擴展性,您可能還必須檢查“ 耐用功能” ,特別是“ 扇出/扇入”模式。

這樣,您可以將handleMessage移到一個活動函數中,該函數將隨您的負載而縮放。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM