Node.js 为什么要使用multer而不是从controller手动上传文件

Node.js 为什么要使用multer而不是从controller手动上传文件,node.js,express,multer,Node.js,Express,Multer,所以我对使用expressjs很陌生,通常我会选择Laravel作为我的后端。但出于某种考虑,我选择expressjs 在Laravel上,当我们处理文件上传时,我们可以在任何地方编写上传逻辑,这是您的自由。您可以将其封装在模型函数中,或将其置于服务中,或任何您想要的地方 但当我使用expressjs时,互联网上有很多文章建议我们使用multer上传文件。由于我以前的背景是使用Laravel,所以我发现使用multer很奇怪。这是因为multer是一个中间件。究竟为什么我们使用中间件来上传图像/

所以我对使用expressjs很陌生,通常我会选择Laravel作为我的后端。但出于某种考虑,我选择expressjs

在Laravel上,当我们处理文件上传时,我们可以在任何地方编写上传逻辑,这是您的自由。您可以将其封装在模型函数中,或将其置于服务中,或任何您想要的地方

但当我使用expressjs时,互联网上有很多文章建议我们使用multer上传文件。由于我以前的背景是使用Laravel,所以我发现使用multer很奇怪。这是因为multer是一个中间件。究竟为什么我们使用中间件来上传图像/文件

这样我就不能将我的业务逻辑封装到一个服务中,它会使代码分离,这意味着我需要从多个地方维护一个业务逻辑。 你能解释一下为什么每个人都选择穆特吗

为什么不直接手动上传到本地存储呢?(实际上现在我不知道怎么做)。 使用此库对分钟有什么好处?

首先,不会以本机方式处理文件上载,因此您会看到加载其他库来处理文件上载。它们都将作为中间件加载,这样就可以将它们注入到请求中,并处理实际上载的文件

来自Symfony的背景,我知道你想要更手动地处理事情,就像我一样。multer还有其他选择;例如,我使用它可以为整个应用加载上传中间件,然后您可以使用
req.files
处理上传。例如:

// load the file upload library as app middleware
const fileUpload = require('express-fileupload');

app.use(fileUpload({
  limits: { fileSize: 50 * 1024 * 1024 },
}));
那么假设您有一个名为“foo”的文件输入:

<input name="foo" type="file" />
文件上载文档中有
req.files
对象的示例以及可以传递给中间件本身的选项。

multer
是一种处理内容类型
多部分/表单数据的正文解析中间件

这意味着它将解析主要用于文件上载的原始http请求数据,并使其更易于访问(存储在磁盘/内存中/…)以进行进一步处理

如果没有multer,如果要访问该文件,就必须自己解析原始数据

这样,我就无法将业务逻辑封装到一个服务和 它使代码分离,这意味着我需要 从多个位置维护一个业务逻辑。你能给我解释一下吗 为什么每个人都选择穆特

multer
,就像其他中间件一样,可以在根目录下用于所有路由,但也可以只放在特定路由上


有关express的更多信息

Hm。是的,但对于使用multer,它将首先将我们从多部分/表单数据上传的图像存储到定义的存储路径。我觉得很奇怪。如果文件已经上传,我们如何限制上传。这是否意味着如果具有上载功能的业务逻辑失败,我们需要手动删除此上载的图像?您可以使用multer配置文件大小限制。除了磁盘存储引擎外,multer还具有内存存储引擎,您可以通过该引擎以
缓冲区
的形式访问文件,并且文件不会存储到磁盘。multer还支持自定义存储引擎,您可以自己或使用s3或gcs等插件处理存储。哦,我明白了,这意味着如果我使用本地存储,那么这意味着我需要在业务逻辑完成后从multer中删除以前上载的文件。好的,非常感谢,先生。这对我帮助很大。谢谢啊,我明白了,谢谢你,这让我对multer的理解更清楚了,但很抱歉,我只是好奇,所以这意味着当我使用laravel时,他们会为我解析所有的请求,嗯?laravel上传的文件和multer一样吗?他们是否会首先将上传的图像存储在我们的服务器上,以便我们可以从$req->files()访问它?如果是这样,那么这意味着UploadedFile对象指向本地存储中的文件,呃?Laravel将为您解析多部分/表单数据文件;很难说它是否上传了与multer相同的内容,因为我不知道你的意思。他们的文件在这里有更多的信息;我提到的库express fileupload默认将文件存储在RAM中,但允许存储到磁盘。
// now handle a file upload
app.post('/upload', function(req, res) {
  console.log(req.files.foo); // the uploaded file object
});