【发布时间】:2016-07-31 15:00:20
【问题描述】:
首先,这是我的第一个 Node 应用程序,如果这个问题很愚蠢,我很抱歉。 所以,问题是我在访问指定的路线后尝试发送 JSON 数据。 我的代码:
var express = require('express');
var path = require('path');
var objFromFolder = require('./objFromFolder');
var app = express();
var initialTree;
var currentTree;
app.set('port', process.env.PORT || 8080);
app.set('views', __dirname + '../../views')
app.set('view engine', 'html');
app.use("/frontend", express.static(__dirname + '/../frontend'));
app.get('/', function (req, res) {
res.json(JSON.stringify(initialTree));
});
app.get('/:folderName', function (req, res) {
var validPath = path.resolve(__dirname + '../../', req.params.folderName);
objFromFolder(validPath, function(err, folderItems) {
if (err) {
throw err;
}
currentTree = folderItems.sort(function (item) {
return !(item.isFolder);
});
});
res.send(JSON.stringify(currentTree));
});
app.listen(app.get('port'), function () {
objFromFolder(__dirname + '../../', function(err, folderItems) {
if (err) {
throw err;
}
initialTree = folderItems.sort(function (item) {
return !(item.isFolder);
});
});
console.log('Ready on port ' + app.get('port'));
});
objFromFolder模块代码:
var objFromFolder = (function () {
var fs = require('fs');
var path = require('path');
var objFromFolder = function (root, returnItems) {
var folderItems = [];
fs.readdir(root, function (err, files) {
if (err) {
throw err;
}
var pending = files.length;
files.forEach(function (file) {
var filePath = path.resolve(root, file);
var fileAsObj = {
path: filePath,
name: file
};
fs.stat(filePath, function (err, stats) {
if (err) {
throw err;
return;
}
if (stats && stats.isFile()) {
fileAsObj.isFolder = false;
}
if (stats && stats.isDirectory()) {
fileAsObj.isFolder = true;
}
folderItems.push(fileAsObj);
if (!--pending) {
returnItems(null, folderItems);
}
});
});
});
}
return objFromFolder;
})();
module.exports = objFromFolder;
此应用程序的任务是将工作目录结构作为对象列表返回。因此,例如,当我访问localhost:8080/node_modules 时,我第一次看到的只是空白页面,但在我刷新页面后,服务器返回 JSON。当我访问/路由时,返回JSON,我不需要刷新页面。
附:我从objFromFolder 模块中删除了错误检查,而不是在files 变量未定义时从函数中删除return。现在/ 路由又可以正常工作了,但其他路由总是在加载中。
【问题讨论】: