Узел J: вложенные вызовы API: просмотрите каталог для файлов, прочитайте данные из каждого файла и ПОЛУЧИТЕ ID из API, POST данные с идентификатором, в другом API - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь,

  1. Постоянно следите за каталогом файлов,
  2. Если какой-либо файл приходит на основе типа файла (выводится из имени файла), вызовите API GET для идентификатора / ключа
  3. POST данные с ключом в другом API.
  4. Переместить файл, из которого публикуются данные, в другой каталог

Я использовал Chokidar, пакеты запроса-обещания.

Проблема в том, что всякий раз, когда в каталог вставляется более одного файла, быстро вызываются API, таким образом, что даже до того, как данные первого файла будут зафиксированы, второй файл обрабатывается. Это приводит к проблеме при получении идентификатора из первого API. Оба файла теперь будут иметь Тот же ключ / ID . Пожалуйста, дайте мне знать, как это исправить, чтобы мы получали уникальные идентификаторы данных из каждого файла.

Вот мой код:

var chokidar = require('chokidar');
const fs = require('fs');
var rp = require('request-promise');
var globalpath = require('path');
console.log("path", globalpath.resolve(process.cwd(), './Data'));

var watcher = chokidar.watch(globalpath.resolve(process.cwd(), './Data/*.json'), {

    ignored: /^\./,
    persistent: true
});
watcher
    .on('add', function (path) {
        readfile(path);
    });

async function readfile(path) {
    fs.readFile(path, function (err, data) {
        if (err != null) {
            console.log(err);
        }
        var loadingdata = JSON.parse(data);
        if (path.indexOf("PO") > -1) {
            var options = {
                method: 'GET',
                uri: 'http://localhost:3005/GetNewPOKey',
                json: true
            };

            rp(options)
                .then(function (parsedBody) {
                    console.log(parsedBody.NextPOKey);
                    var options2 = {
                        method: 'POST',
                        uri: 'http://localhost:3005/createPO?id='+parsedBody.NextPOKey,
                        body: loadingdata,
                        json: true
                    };

                    rp(options2)
                        .then(function (parsedBody) {
                            console.log(parsedBody);
                            if (parsedBody === "OK") {
                                moveit(path);
                            }
                            // POST succeeded...
                        })
                        .catch(function (err) {
                            console.log("API error :" + err);
                            // POST failed...
                        });
                    // GET succeeded...
                })
                .catch(function (err) {
                    console.log("API error :" + err);
                    // GET failed...
                });

        }
        else {
            console.log("Unknown File" + path);
        }

    });

}

function moveit(mypath) {
    // console.log("This file is posted " + path);
    let oldpath = mypath;
    let newpath = globalpath.resolve(process.cwd(), './History') + "/" + globalpath.basename(mypath.split('.').join('-' + Date.now() + '.'));
    console.log("This is the new filename " + newpath);
    fs.rename(oldpath, newpath, (err) => {
        if (err) throw err;
        console.log('Rename complete!');
    });
}

1 Ответ

0 голосов
/ 18 июня 2019

Я не мог найти правильное решение, чтобы продолжать использовать наблюдателя Чокидара.Вместо этого я написал этот код и запланировал скрипт в ОС, чтобы искать файлы.

const fs = require('fs');
var request = require('request');
var rp = require('request-promise');
var globalpath = require('path');
console.log("path", globalpath.resolve(process.cwd(), './Data'));
const directoryPath = globalpath.resolve(process.cwd(), './Data');

fs.readdir(directoryPath, async function (err, files) {
    if (err) {
        return console.log('Unable to scan directory: ' + err);
    }
    let allfiledata = [];
    let allkeys = [];

    files.forEach(function (file) {
        if (file.indexOf("json") > -1) {
            console.log(file);
            data = fs.readFileSync(directoryPath + "/" + file)
            var loadingdata = JSON.parse(data);
            allfiledata.push(loadingdata);
            moveit(directoryPath + "/" + file);
        }
    });
    if (allfiledata.length > 0) {
        request({
            url: 'http://localhost:3005/GetNewPOKey',
            json: true
        }, function (err, res, body) {
            if (err) {
                console.log("API error :" + err);
            }
            let nextkey = body.NextPOKey;
            allkeys.push(nextkey);
            var number = parseInt(nextkey.slice(2, ));
            for (let i = 1; i < allfiledata.length; i++) {
                number = number + 1;
                allkeys.push("PO" + number);
            }
            console.log(allkeys);
            console.log(allfiledata.length);
            for (let i = 0; i < allkeys.length; i++) {
                //setTimeout(function(){console.log(Date.now())},120000);
                console.log(allfiledata[i]);
                console.log('http://localhost:3005/createPO?id=' + allkeys[i]);
                var options2 = {
                    method: 'POST',
                    uri: 'http://localhost:3005/createPO?id=' + allkeys[i],
                    body: allfiledata[i],
                    json: true
                };

                rp(options2)
                    .then(function (parsedBody) {
                        console.log(parsedBody);
                        if (parsedBody === "OK") {
                            console.log("success");
                        }
                        // POST succeeded...
                    })
                    .catch(function (err) {
                        console.log("API error :" + err);
                        // POST failed...
                    });
            }
        });
    }
});


function moveit(mypath) {
    let oldpath = mypath;
    let newpath = globalpath.resolve(process.cwd(), './History') + "/" + globalpath.basename(mypath.split('.').join('-' + Date.now() + '.'));
    console.log("This is the new filename " + newpath);
    fs.rename(oldpath, newpath, (err) => {
        if (err) throw err;
        console.log('Rename complete!');
    });
}
...