我正在使用没有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
答案 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)
})
}