【问题标题】:I only get all data one time我只获得一次所有数据
【发布时间】:2023-03-18 05:05:02
【问题描述】:

我正在使用没有 express.js 框架的 node.js 创建 REST API,对于数据库我使用 fs。我在使用 get 方法时遇到问题。所有其他方法都可以正常工作。当我尝试从目录中获取所有 json 文件时,我只能一次、第二次和所有其他时间获取所有内容,没有任何反应,甚至没有错误,它只是卡住了几分钟,之后我在 chrome 中收到此错误: net::ERR_EMPTY_RESPONSE,这在 Firefox 中:TypeError:“尝试获取资源时出现网络错误。”。获取一个 json 文件可以正常工作。我认为问题出在后端。因为我和邮递员有同样的问题。

我正在使用节点 10.14.1。据我了解,当我第二次尝试从目录中获取所有文件时,我的 server.js 文件不发送任何响应。并且应用在 server.js 第 64 行中的 selectedHandler 之前停止。

获取处理程序:

// Resources - get
// Required data: none
// Optional data: ID
handlers._resources.get = (data, callback) => {
// Check that the ID is valid
checkId(data.queryStringObject.id)

if (resourceDBId) {
    // Lookup the resource
    _data.read('resources', resourceDBId, (err, data) => !err &&
    data ? callback(ok, data) : callback(notFound, {Error: 'User doesn\'t exist'}))
} else {
    _data.readAll('resources', (err, data) => {
        if (!err && data) {
            if (data.last) {
                resourcesData.push(data.data)
                callback(ok, resourcesData)
            }
            if (!data.last) resourcesData.push(data.data)
        } else callback(internalServerError, {Error: 'Can\'t get all resources'})
    })
}

}

所有代码都在这里:https://github.com/FreeDevStan/sale

【问题讨论】:

  • 请在此处发布相关代码:在问题/答案中指向外部源代码不被认为是好的做法,此处...
  • 它的代码很多,所以我觉得在github上看会容易得多
  • "and for database I use fs" 你到底是什么意思? fs 用于与文件系统交互,文件不是数据库。
  • 文件夹是数据库。 .json 文件是数据库记录/文档

标签: node.js rest fs


【解决方案1】:

lib/data.js 文件中的 readAll 方法需要初始化 i。 因为 i 使用 undefined,所以被当作全局变量 i 处理,不进入循环,回调也不起作用,所以无法响应。

我建议您如下更改。

lib.readAll = (dir, callback) => {
fs.readdir(lib.baseDir + dir, (err, data) => {
    if(!err && data) {
        let i = 0;
        while(i < data.length) {
            if (i < data.length - 1) {
                fs.readFile(lib.baseDir + dir + '/' + data[i], 'utf-8', (err, content) => {
                    let parsedContent = helpers.parseJsonToObject(content)
                    err ? callback(err, content) : callback(false, {last: false, data: parsedContent})
                })
            } if (i === data.length - 1) {
                fs.readFile(lib.baseDir + dir + '/' + data[i], 'utf-8', (err, content) => {
                    let parsedContent = helpers.parseJsonToObject(content)
                    err ? callback(err, content) : callback(false, {last: true, data: parsedContent})
                })
            }
            i++
        }
    } else callback(err, data)
})

}

【讨论】:

  • 它几乎有所帮助,但在这种情况下。当我尝试获取所有文件时,首先我得到 2 个文件,第二次得到 4 个文件,第三次得到 6 个文件,依此类推。但在数据库中只有 2 个文件
  • 我找到了答案。问题出在 handlers.js 中,我必须在 _data.readAll 回调中初始化 resourcesData,而不是在文件顶部
  • 感谢您的帮助 ;)
  • 但是,这只是为了解决当前的问题,我认为即使数据为 if(0 == i) 在没有数据的情况下也可以调用回调是很好的.
  • 我不明白你的评论是什么意思。现在我有另一个问题:D 有时我只得到第二个文件数据,有时两个文件数据。
猜你喜欢
  • 1970-01-01
  • 2021-12-22
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2014-01-17
  • 2017-06-09
相关资源
最近更新 更多