我一次只能获得所有数据

时间:2019-02-04 08:52:23

标签: node.js rest fs

我正在使用没有express.js框架的node.js创建REST API,对于数据库,我使用fs。我在使用get方法时遇到问题。所有其他方法都可以正常工作。当我尝试从目录中获取所有json文件时,我只能一次,第二次以及所有其他时间都获取所有内容,什么也没有发生,甚至没有错误,它停留了几分钟,然后在chrome中出现了此错误: net :: ERR_EMPTY_RESPONSE,这在firefox中:TypeError:“尝试获取资源时出现NetworkError。”。获取一个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

1 个答案:

答案 0 :(得分:0)

lib / data.js文件中的readAll方法需要初始化i。 由于未定义使用i,因此将其视为全局变量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)
})

}