Nodejs:如何在从 API 请求获得的原始文件数据中重复检查特定字符串?

Nodejs: How to check for particular string repeatedly within raw file data obtained from API request?

我有一个使用 Nodejs 开发的应用程序。此应用程序正在向 GitLab API 发出请求并从中获取原始文件数据。

我想读取出现在另一个字符串之后的特定字符串,并从中获取所有类似的数据。我对这部分有点困惑,无法继续进行,有人可以向我解释如何实现吗?

以下是示例文件数据: 如果在关键字 Scenario: 之后出现,我想阅读所有数字,即在这种情况下,我想获得 A001-D002 & K002-M002。这些数字可以是任意的,并且可以出现在文件内容中的任何位置。我想阅读它们并将它们存储在该特定文件的数组中。

FileName: File Data
  Background:
    This is some random background

  Scenario: A001-D002 My first scenario
    Given I am sitting on a plane
    When I am offered drinks

  Scenario: K002-M002 My second scenario
    Given when I book the uber taxi
    When I get the notifications

我不明白如何遍历文件内容并读取每个单词并匹配并相应地获取 ID。

以下是我向 GitLab 发出请求并获取原始文件内容的代码: ./index.js:

const   express     =   require('express');
const   http        =   require("http");
const   bodyParser  =   require('body-parser');
const   app         =   express();
const   port        =   process.env.PORT || 9000;
const   gitlabDump  =   require("./controller/GitLabDump");

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true }));

//Make NodeJS to Listen to a particular Port in Localhost
app.listen(port, function(){

        gitlabDump.gitlabDump(type, function(data){
            console.log("Completed Execution for GitLab")
            process.exit();
        })
    
}

我的./controller/GitLabDump.js:

const request = require('request');
const https = require('https');
const axios = require('axios');

exports.gitlabDump = function(callback){
    var gitlabAPI = "https://gitlab.com/api/v4/projects/<project_id>/repository/files/tree/<subfolders>/<fileName>/raw?ref=master&private_token=<privateToken>";

    //Make the request to the each file and read its raw contents
    request(gitlabAPI, function(error, response, body) {
        const featureFileData = JSON.parse(JSON.stringify(body)).toString();

        console.log(featureFileData)
        
        for(const match of featureFileData.matchAll("Scenario:")){
            console.log(match);
        }

        callback("Completed");
    })

    
}

我可以打印文件内容。有人可以向我解释如何遍历原始文件内容并获取所有必需的 ID 吗?

我建议您使用一种方法,通过遍历每一行来分析字符串的每一部分(我假设您的字符串就像您的示例中一样)。它比使用正则表达式更容易理解和编码。

下面的示例代表您的 request 回调函数。 我将代码分成 3 个逻辑:

  • 搜索文件名
  • 搜索我们感兴趣的行(“场景”字)
  • 通过过滤功能提取ID

之后您可以轻松更改您的 ID 过滤器 (txt.substr(0, txt.indexOf(' ')) 以使用更合适的表达来提取您的句子。

结果被发送到回调函数,第一个参数是文件名,第二个是所有 ID。就像您在示例中所做的那样。

((callback) => {

    const featureFileData = `FileName: File Data
      Background:
        This is some random background

      Scenario: A001-D002 My first scenario
        Given I am sitting on a plane
        When I am offered drinks

      Scenario: K002-M002 My second scenario
        Given when I book the uber taxi
        When I get the notifications`;

    // find "filename"
    const filenames = featureFileData.split('\n')
        .filter(line => line.trim().substr(0,8) === 'FileName')
        .map((raw) => {
            if(!raw) return 'unknown';
            const sentences = raw.trim().split(':');
            if(sentences[1] && sentences[1].length) {
                return sentences[1].trim();
            }
        });

    // filter the "Scenario" lines
    const scenarioLines = featureFileData.split('\n')
        .map((line) => {
            if(line.trim().substr(0,8) === 'Scenario') {
                const sentences = line.trim().split(':');
                if(sentences[1] && sentences[1].length) {
                    return sentences[1].trim();
                }
            }
            return false;
        })
        .filter(r => r !== false);

    // search ids
    const ids = scenarioLines.map(txt => txt.substr(0, txt.indexOf(' ')));

    callback(filenames[0], ids);

})(console.log)