很长一段时间以来,我一直认为虽然 nodeJS/expressJS 是单线程的,但至少所有涉及 I/O 的东西都是并行运行的。并非如此:我发现接收大请求(大文件上传)的单个路由实际上正在阻止所有其他请求,甚至在实际处理路由代码(我的代码)之前。也许我写得不正确?这是我的 expressJS 路线代码:
import express from 'express'
import {asyncHandler} from '../../helpers/asyncHandler'
import multer from 'multer'
const adminRoute = express.Router()
const storage = multer.memoryStorage()
const upload = multer({ storage: storage })
adminRoute.post('/UploadAddressesXlsx', upload.any(), asyncHandler(async (req, res) => {
console.log('started handling file upload')
res.status(200).type('json').send('finished')
}))
export default adminRoute
所以当用户开始将文件上传到该路由时,“开始处理文件上传”消息是not尚未显示。整个上传完成后,才真正显示出来。并且在上传期间,此 expressJS 服务器的所有其他路由均无响应。这意味着阻塞服务器的是 I/O,甚至不是我的代码。有没有更好的方法来处理这个问题?
这就是您使用的 multer 中间件的工作方式。它不会阻止其他请求。它正在处理这个请求。您可以在您的服务器上自由运行其他请求。
multer 中间件在调用路由处理程序的其余部分之前处理整个上传。那是因为你的路由处理程序的其余部分期望
req.files
完全填充所有准备好处理的上传,并且在 multer 完成整个上传之前不会发生这种情况。
“开始处理文件上传”消息不会显示(按设计),直到 multer 处理了整个上传。但是,在此期间,您的 Express 服务器可以自由处理其他请求。
仅供参考,还有其他使用 multler 的方法,涉及流,您可以在其中参与上传的实时处理。但是,您在这里使用 multer 的方式是要求它为您做所有事情,并且只在上传完成后才调用您的请求处理程序。
在上传过程中,此 expressJS 服务器的所有其他路由均无响应
事实并非如此。根据您对此进行测试的方式,您可能会看到浏览器(而不是服务器)实施的限制。如果您尝试来自不同浏览器的其他请求,它们应该可以正常工作。出于测试目的,只需尝试将一个简单的网页从您的服务器加载到不同的浏览器中。