Чтение JSON массива из хранилища и отправка в GCP PubSub - PullRequest
0 голосов
/ 30 января 2020

У меня есть несколько файлов в Google Cloud Storage, каждый файл содержит массив JSON, как показано ниже -

{
  "Data": [
    {
      "Country": "IN",
      "Order": "1033616591",
      "Method": "LCD zone E same day",
      "WorkOrderNo": "1033616591",
      "Zipcode": "6020",
      "OriginalTimeSlot": "2019-05-29 14:00-18:00",
      "CurrentTimeSlot": "2019-05-29 14:00-18:00",
      "Shipment": "98:2",
      "WOCreationDate": "2019-05-27T18:21:15Z",
      "ModifactionDate": "2020-01-17T16:50:58Z",
      "Dispatch": {
        "Status": "00",
        "DispatchUnit": []
      },
      "Parcels": {
        "Parcel": [
          {
            "Active": true,
            "Weight": 29.087833333333332,
            "Volume": 0.27791899999999997,
            "Trackingstatus": "",
            "Number": "704648048"
          },
          {
            "Active": true,
            "Weight": 29.087833333333332,
            "Volume": 0.27791899999999997,
            "Trackingstatus": "",
            "Number": "704648049"
          },
          {
            "Active": true,
            "Weight": 29.087833333333332,
            "Volume": 0.27791899999999997,
            "Trackingstatus": "",
            "Number": "704648050"
          },
          {
            "Active": true,
            "Weight": 29.087833333333332,
            "Volume": 0.27791899999999997,
            "Trackingstatus": "",
            "Number": "704648051"
          },
          {
            "Active": true,
            "Weight": 29.087833333333332,
            "Volume": 0.27791899999999997,
            "Trackingstatus": "",
            "Number": "704648052"
          },
          {
            "Active": true,
            "Weight": 29.087833333333332,
            "Volume": 0.27791899999999997,
            "Trackingstatus": "",
            "Number": "704648053"
          }
        ]
      },
      "TimeSlotId": "d2916acd-1f36-4604-98dc-0d11014a045c"
    },
    {
      "Country": "IN",
      "Order": "1049968941",
      "Method": "LCD zone A",
      "WorkOrderNo": "1049968941",
      "Zipcode": "6020",
      "OriginalTimeSlot": "2019-09-26 06:00-10:00",
      "CurrentTimeSlot": "2019-09-26 06:00-10:00",
      "Shipment": "98:2",
      "WOCreationDate": "2019-09-02T16:17:13Z",
      "ModifactionDate": "2020-01-17T16:40:18Z",
      "Dispatch": {
        "Status": "00",
        "DispatchUnit": []
      },
      "Parcels": {
        "Parcel": [
          {
            "Active": true,
            "Weight": 44.5,
            "Volume": 1.147163,
            "Trackingstatus": "",
            "Number": "704987779"
          }
        ]
      },
      "TimeSlotId": "3c3da1d2-000d-402a-856d-0d89013a6961"
    }
  ]
}

Теперь я пытаюсь прочитать каждый файл из хранилища, отделяя каждый JSON на основе Поле «Страна» и publi sh совпадают с Google PubSub. Ниже того, что я пробовал -

const express = require('express')
const app = express()
const port = 8080
const { PubSub } = require('@google-cloud/pubsub');

const projectId = 'my_project_id';
const keyFilename = 'myjson.json';
const pubsub = new PubSub({ projectId, keyFilename });
const topicName = 'pubsub_topic_name';
const subscriptionName = 'pubsub_subscription_name';
const { Storage } = require('@google-cloud/storage');
const storage = new Storage();
const timeout = 60;

const subscription = pubsub.subscription(subscriptionName);
let messageCount = 0;
const bucketName = 'temp-shipment';

app.get('/', async function (req, res) {
    var messageIds = "";
    console.log('Line 1');
    const [files] = await storage.bucket('bucketname').getFiles();
    console.log('Line 2');
    var bkt = '';
    var i = 0;
    files.forEach(file => {
        console.log('name of file' + file.name);
        var archivo = file.createReadStream();
        bkt = '';
        console.log('---- bkt value:' + bkt);
        archivo.on('data', async function (d) {
            console.log('---- bkt value 2:' + bkt);
            bkt += d;
            i = i + 1;
            console.log('---- bkt value 3:' + bkt);
        }).on('end', async function () {

            console.log('---- bkt value 4:' + bkt);
            console.log(">>>>END CALLED i" + i)
            console.log("bky:" + bkt.replace(/(?:\\[rn])+/g, '').trim().toString());

            try {
                var kktrim = bkt.replace(/(?:\\[rn])+/g, '').trim();
                var kk = JSON.parse(kktrim);

                for (var v of kk.Data) {

                    var myJsonObject = { message: JSON.stringify(v) }
                    const data = JSON.stringify(myJsonObject);
                    console.log("Data: " + data);
                    const dataBuffer = Buffer.from(data);
                   // console.log("buffer" + dataBuffer);
                    const messageId = await pubsub.topic(topicName).publish(dataBuffer);
                    console.log("MessageId>>>>>>>>>>>>>>>>>>>" + messageId);
                    //messageIds += ":" + messageId;
                    //console.log(messageIds);

                }
                bkt = '';
            } catch (ex) {
                console.log('error' + ex + 'in ' + file.name);
            }


        })


    });

    res.send('Message successfully sent!\nTopic: messages' + messageIds);
});
app.listen(port, () => console.log(`Example app listening on port ${port}!`))

Этот код читает файлы, но код фактически конвертирует один файл и выдает ошибку для других. Для других файлов выдает эту ошибку -

textPayload: "errorSyntaxError: Unexpected token { in JSON at position 1696in IN.json" 

Нужна помощь, чтобы решить проблему. Я не могу понять, чего мне здесь не хватает.

1 Ответ

0 голосов
/ 03 февраля 2020

Проблема в том, что файлы JSON добавляются. Первый JSON проанализирован:

{
  "Data": 
    ...
}

Однако второй JSON попытался выполнить синтаксический анализ:

{
  "Data": 
    ...
}
{
  "Data": 
    ...
}

Следовательно, "неожиданный токен" {"был найден в. .. "error.

Это вызвано переменной bkt, переменной, которая используется для анализа JSON:

var kktrim = bkt.replace(/(?:\\[rn])+/g, '').trim();
var kk = JSON.parse(kktrim);

Но переменная объявляется перед итерацией поверх файлов:

var bkt = '';
var i = 0;
files.forEach(file => {
    // More code
});

Вы можете переместить объявление переменной, чтобы разделить файлы JSON, и решить проблему:

var i = 0;
files.forEach(file => {
    var bkt = '';
    // More code
});
...