gpt4 book ai didi

javascript - Express/Node.js |从 glob 调用中生成新的 JSON 对象

转载 作者:太空宇宙 更新时间:2023-11-04 03:19:33 24 4
gpt4 key购买 nike

我对 JS 很陌生,我认为我缺少一些关于对象状态存储和嵌套函数调用结构的基本知识。

我正在遍历一个包含许多 JSON 文件的目录,并且我想迭代加载这些文件并将内容解析为单个 JSON 对象。我正在函数内部正确解析内容,但正如我所编写的那样,对象状态不会在函数外部持续存在。

const glob = require('glob');

const retrieve = (query) => {
const dataJSON = {};
const json_path = saveDir + '/upload/' + query + '/'
glob(json_path + '*.json', function (er, files) {
for (index in files) {
dataJSON[index] = require(files[index])
}
// Logging here returns the correct object
console.log(dataJSON)
return dataJSON
});
// Logging here returns an empty object
console.log(dataJSON)
return dataJSON

}

// I need to return the object here
app.get('/patent', (req, res) => {
res.json(retrieve(req.query['q']))
});

两个问题,如何在 glob 外部保留“dataJSON”,以及如何从 glob 外部返回"file"?

例如。第二个问题

var example = glob("**/*.js", function (er, files) {
// files is an array of filenames.

return files
})

console.log(example)
>>['file1.json', 'file2.json', 'file3.json']

最佳答案

只是为了进一步迭代泰勒的答案,因为您是 JS 新手。 JavaScript 由于其异步性而严重依赖回调或 Promise。这意味着您读取代码的顺序并不(始终)是代码执行的顺序。

您的代码如下所示:

  1. 定义函数检索
  2. 定义一些变量
  3. 调用glob读取一些文件
  4. 对这些文件执行一些操作//loggin here 返回正确的
  5. 返回dataJSON结果//此处登录返回空

但是会按照以下顺序执行:

  1. 定义函数检索
  2. 定义一些变量
  3. 调用glob读取一些文件
  4. 返回dataJSON结果//此处登录返回空
  5. 对这些文件执行一些操作//loggin here 返回正确的

原因是 glob 调用需要一些时间(列表中的 nr 3)。这可能只是几毫秒,但您的代码会继续运行。因此,当 glob 正在读取这些文件时,您的程序仍在运行。当 glob 完成时,它会运行回调函数。

回调基本上是“嘿,当您读取这些文件时,然后对它们执行此操作”

因此,当您执行 console.log 时,您没有对文件执行任何操作。 Glob 仍在工作。

您可以通过一些console.logs看到这一点。

const retrieve = (query) => {
console.log('STEP 1')
const dataJSON = {};
const json_path = saveDir + '/upload/' + query + '/'
glob(json_path + '*.json', function (er, files) {
for (index in files) {
dataJSON[index] = require(files[index])
}
// Logging here returns the correct object
console.log('STEP 2')
return dataJSON
});
console.log('STEP 3')
// Logging here returns an empty object
console.log(dataJSON)
return dataJSON
}

所以你会认为输出是:

STEP 1
STEP 2
STEP 3

但它将是:

STEP 1
STEP 3
STEP 2

有几种像泰勒提到的方法可以解决这个问题。

您可以继续回调。

const glob = require('glob');

const retrieve = (query, cb) => {
const dataJSON = {};
const json_path = saveDir + '/upload/' + query + '/'
glob(json_path + '*.json', function (er, files) {
for (index in files) {
dataJSON[index] = require(files[index])
}
// Logging here returns the correct object
console.log(dataJSON)
cb(dataJSON)
});
}

app.get('/patent', (req, res) => {
retrieve(req.query['q'], function(resultsFromGlob) {
res.json(resultsFromGlob)
})
});

请注意,我向您的检索函数添加了一个新参数。这是回调,以便我们知道 glob 何时完成。现在我可以在路由器中使用该回调。

另一种方法是使用 Promise。

这是泰勒建议的方法,我同意。就我个人而言,我更喜欢 promise 而不是回调。

const retrieve = (query) => {
return new Promise((resolve,reject) => {
const dataJSON = {};
const json_path = saveDir + '/upload/' + query + '/'
glob(json_path + '*.json', function (er, files) {
if (error) {
reject(error)
}

for (index in files) {
dataJSON[index] = require(files[index])
}

resolve(dataJSON);
});
})
}

app.get('/patent', (req, res) => {
retrieve(req.query['q']).then(resultsFromGlob => {
res.json(resultsFromGlob)
})
});

这也让我可以选择使用 async/await

const retrieve = async (query) => {
return new Promise((resolve,reject) => {
const dataJSON = {};
const json_path = saveDir + '/upload/' + query + '/'
glob(json_path + '*.json', function (er, files) {
if (error) {
reject(error)
}

for (index in files) {
dataJSON[index] = require(files[index])
}

resolve(dataJSON);
});
})
}

app.get('/patent', async (req, res) => {
const resultsFromGlob = await retrieve(req.query['q'])
res.json(resultsFromGlob)
});

关于javascript - Express/Node.js |从 glob 调用中生成新的 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51938171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com