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)
我有一个使用 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)