Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Node.js读取文件夹中的所有文件_Javascript_Node.js_Express_Fs - Fatal编程技术网

Javascript 使用Node.js读取文件夹中的所有文件

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

从文件夹中读取文件非常简单。该文件为.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());
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