Node.js 如何使用Express获取目录内容?
我尝试从目录中获取所有文件(名称)。我使用Node.js 如何使用Express获取目录内容?,node.js,express,Node.js,Express,我尝试从目录中获取所有文件(名称)。我使用Node.js+Express。这是我的快递代码: var express = require('express'); var fs = require('fs'); var path = require('path'); var router = express.Router(); router.get('/', function (req, res) { var filePath = path.join(path.resolve(__dir
Node.js
+Express
。这是我的快递代码:
var express = require('express');
var fs = require('fs');
var path = require('path');
var router = express.Router();
router.get('/', function (req, res) {
var filePath = path.join(path.resolve(__dirname, '..'), '/public/images/');
var directoryContent = [];
getDirectoryContent(filePath, directoryContent);
res.send(directoryContent);
});
function getDirectoryContent(dir, arr) {
fs.readdir(dir, function (err, flist) {
if (err) {
return;
}
var elemNum = 0;
var processEntry = function (entry) {
arr.push(entry);
//console.log(entry);
};
var dirIterator = function () {
processEntry(flist[elemNum]);
elemNum++;
if (elemNum < flist.length) {
process.nextTick(dirIterator);
}
};
if (elemNum < flist.length) {
process.nextTick(dirIterator);
}
});
}
module.exports = router;
var express=require('express');
var fs=需要('fs');
var path=require('path');
var router=express.router();
router.get('/',函数(req,res){
var filePath=path.join(path.resolve(uu dirname,“…”),“/public/images/”);
var directoryContent=[];
getDirectoryContent(文件路径,directoryContent);
res.send(目录内容);
});
函数getDirectoryContent(dir,arr){
fs.readdir(dir,function(err,flist){
如果(错误){
返回;
}
变量元素=0;
var processEntry=函数(条目){
arr.push(进入);
//控制台日志(条目);
};
var dirIterator=函数(){
processEntry(flist[elemNum]);
元素++;
if(元素<起始长度){
process.nextTick(dirIterator);
}
};
if(元素<起始长度){
process.nextTick(dirIterator);
}
});
}
module.exports=路由器;
但结果是[]-空数组。我做错了什么
PS
我们发现问题出在回调机制中。Bit I可能是错误的。您不尊重目录读取操作的异步性质。
fs.readdir
是异步的,将“最终”导致调用您的处理函数,因此您必须告诉Node.js,当发生这种情况时,它需要恢复工作:
var express = require('express');
var router = express.Router();
var fs = require('fs');
var path = require('path');
var imagePath = path.join(path.resolve(__dirname, '..'), '/public/images/');
function getDirectoryContent(req, res, next) {
fs.readdir(imagePath , function (err, images) {
if (err) { return next(err); }
res.locals.filenames = images;
next();
});
}
router.get('/', getDirectoryContent, function(req, res) {
// build a response using res.locals.filenames here.
// just sending the names is silly, and so for demonstration only
res.send(res.locals.filenames);
});
module.exports = router;
res.locals
上,然后告诉express转到路由中的下一个中间件函数res.locals.filenames
,生成一个结果,我们知道它存在,因为否则我们不会到达路由处理的这一部分,下一个(错误)将发生,express将把我们移到错误处理程序问题在于
fs.readdir
方法是一个异步操作。实际上,您必须向该方法传递回调函数,并等待操作执行
现在它是空的,因为您在操作完成之前刷新了响应
您可以使用fs.readdirSync
开关进行同步操作。结果是一个文件数组(如果有)。如果发生错误,它将被抛出,因此您需要在函数中捕获错误
router.get('/',函数(req,res){
var filePath=path.join(path.resolve(uu dirname,“…”),“/public/images/”);
试一试{
var directoryContent=fs.readdirSync(filePath);
res.send(目录内容);
}捕获(e){
其次(e);
}
});代码>