【问题标题】:how should I handle this nodejs code to do the rigth things?我应该如何处理这个节点 js 代码来做正确的事情?
【发布时间】:2020-06-09 19:42:07
【问题描述】:

这是我在这里的第一个问题。我需要一些关于我的代码结构的帮助。我在节点中的 api 与 express 必须执行以下操作: 收据GET /api/file/{filename} 返回文件内容,它可能很大(几 GB)。 目前,我可以获取带有流的文件,但在这种情况下我不是处理错误的最佳实践。

'use strict';
const fs = require('fs'); 
const express = require('express');
const app = express();
const path = require('path');
const filePath = path.join(__dirname, `../file`);




console.log(filePath)

app.get('/api/:filename', (req, res) => {
  let filename = req.params.filename
  const streamFile = fs.createReadStream(`${filePath}/${filename}`);
  streamFile.pipe(res);
} );


module.exports = app;

我是否应该创建另一个目录,也许是“模块”,并编写一个异步函数来读取和管道文件,并从路由目录中的 app.get 调用该函数?

【问题讨论】:

    标签: javascript node.js express stream


    【解决方案1】:

    请记住,Express 是一个“用于 Node.js 应用程序的无主见、极简主义 Web 框架”,无主见意味着它不会在很多方面为你决定你为每个特定任务使用什么工具,那就是与 Rails 等其他框架的主要区别。也就是说,您可以使用经典的和旧的trycatch,在这种情况下围绕您的I/O 操作。模块是一种保持关注点分离的方法,它是一种组织代码的方法,因此您可以快速识别导致故障的代码部分。所以在这种情况下,我认为没有必要,因为您的路由器的回调正在做一件事,这没关系。

    app.get('/api/:filename', (req, res) => {
      let filename = req.params.filename
      try{
          const path = `${filePath}/${filename}`;
          if (!fs.existsSync(path)) return res.status(404).send('You could send any message here...');
          const streamFile = fs.createReadStream(path);
          streamFile.pipe(res);
      } catch {
          res.status(500).send();
      };
    });
    

    【讨论】:

    • 你帮了我很多。谢谢 !!如果流失败,您的代码会处理错误,但如果文件不存在会发生什么?我找不到如何处理这个问题,当 :filename 不正确时我的程序崩溃。我认为有些是这样的:if (!streamFile) { res.send() etc } 但 streamFile 对象还是被创建了。
    • 我很乐意提供帮助。如果此答案或任何答案解决了您的问题,请单击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
    • 完成了!我会尽快发布新答案哈哈,再次感谢。
    猜你喜欢
    • 2019-01-06
    • 2012-06-12
    • 2010-12-27
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多