Javascript 使用Node.js读取文件夹中的所有文件
从文件夹中读取文件非常简单。该文件为.md格式,并在与POST一起发送之前转换为html格式:Javascript 使用Node.js读取文件夹中的所有文件,javascript,node.js,express,fs,Javascript,Node.js,Express,Fs,从文件夹中读取文件非常简单。该文件为.md格式,并在与POST一起发送之前转换为html格式: const express = require('express'); const bodyParser = require('body-parser'); const showdown = require('showdown'); const app = express(); const port = process.env.PORT || 5000; app.use(bodyParser.json
const express = require('express');
const bodyParser = require('body-parser');
const showdown = require('showdown');
const app = express();
const port = process.env.PORT || 5000;
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
converter = new showdown.Converter();
app.post('/api/world', (req, res) => {
fs = require('fs');
fs.readFile(
__dirname + '/posts/my-file.md',
'utf8',
function (err, data) {
if (err) {
return console.log(err);
}
text = data;
html = converter.makeHtml(text);
res.send(html);
}
);
});
app.listen(port, () => console.log(`Listening on port ${port}`));
现在,当文件夹中有更多文件时会发生什么?为了获得这些文件的标题,我的做法如下:
fs = require('fs');
fs.readdir(__dirname + '/posts', (err, files) => {
if (err) console.log(err);
else {
console.log('\nCurrent directory filenames:');
files.forEach((file) => {
console.log(file);
});
}
});
上面的代码记录该文件夹中文件的标题
当我想读取这些文件并发送它们时,就会出现问题,就像我在开始时处理第一个文件一样。我就是这样尝试的:
app.post('/api/world', (req, res) => {
fs = require('fs');
fs.readdir(__dirname + '/posts', (err, files) => {
if (err) console.log(err);
else {
console.log('\nCurrent directory filenames:');
files.forEach((file) => {
// console.log(file);
fs.readFile(__dirname + '/posts/' + file, 'utf8', function (err, data) {
console.log(file);
if (err) {
return console.log(err);
}
text = data;
html = converter.makeHtml(text);
res.send(html);
});
});
}
});
});
它抛出以下错误:
res.send(html);
^
ReferenceError: res is not defined
我不明白,
res
是在POST请求的顶部定义的。它有什么问题?如何更改它才能工作?每个请求只能获得一个res.send()
,因此如果使用res.send()
,则必须累积内容,然后一次发送所有内容
而且,由于您同时拥有多个异步操作,因此您还必须跟踪这些操作何时完成。使用带有async/await
的承诺最容易做到这一点
假设您只想连接生成的所有HTML,可以执行以下操作:
const fsp = require('fs').promises;
const path = require('path');
app.post('/api/world', async (req, res) => {
try {
let html = "";
const basePath = path.join(__dirname, 'posts');
const files = await fsp.readdir(basePath);
for (let f of files) {
const fileData = await fsp.readFile(path.join(basePath, f));
html += converter.makeHtml(fileData);
}
res.send(html);
} catch(e) {
// log error and send error response
console.log(e);
res.sendStatus(500);
}
});
看起来不错,但我希望他们作为单独的文件,因为这是如何在前端使用它们。有没有可能不用连接就可以做到这一点?@dadsa-我不明白你想向客户端发送什么,所以在你解释你想完成什么之前,我真的不知道还能推荐什么。您可以为每个请求发送一个响应。因此,您不能多次调用
res.send()
。您可以控制如何将HTML连接在一起(如果您希望在它们之间使用分隔符或其他东西)。为了进一步提供帮助,我需要知道您在一次响应中实际试图发送给客户端的内容。文件夹中的所有文件都是.md文件。在node.js中,我想将它们转换为html(已经完成),并将这些文件发送到前端。在前端,我为每个页面创建了新的路由(目前它只处理一个文件,因为我不知道如何发送多个文件)。现在更清楚了吗?@dadsa-对不起,我还是不明白。路由通常是在服务器上创建的,而不是在客户端创建的。还是不明白你想给客户发送什么。客户端是否希望“下载”并分别保存这些多个文件?这和它们有什么关系?像数组之类的东西这些文件会很有用,这样我就可以遍历它们了。我正在使用react router dom