Node.js 为什么我的函数在storage.single中调用了两次?

Node.js 为什么我的函数在storage.single中调用了两次?,node.js,multer,Node.js,Multer,我不知道为什么,但我的函数在storage.single中被调用了两次 app.post(“/upload file”),异步(req,res,next)=>{ 试一试{ 导出常量inMemoryStorage=(opts={})=>{ 返回multer({storage:multer.memoryStorage(),…defaultOpts, …选项}) } 常量存储=inMemoryStorage(); storage.single('文件')(请求,res,()=>{ console.lo

我不知道为什么,但我的函数在
storage.single中被调用了两次

app.post(“/upload file”),异步(req,res,next)=>{
试一试{
导出常量inMemoryStorage=(opts={})=>{
返回multer({storage:multer.memoryStorage(),…defaultOpts,
…选项})
}
常量存储=inMemoryStorage();
storage.single('文件')(请求,res,()=>{
console.log(req.file)//在上次更新中
console.log('called')//返回两次
返回此.uploadService.uploadFile(req)
})
}捕捉(错误){
下一个(错误);
}
});
}
如果你有解决办法,谢谢你。我只希望我的函数被调用一次

----新编辑----

所以我的上传服务是这样的:

  async uploadFile(req) {

    const b2 = new B2({
      applicationKeyId: 'private1',
      applicationKey: 'private2'
    })

    const upload = await b2.getUploadUrl({ bucketId: 'my-private-key' })

    const myfile = await b2.uploadFile({
      uploadUrl: upload.data.uploadUrl,
      uploadAuthToken: upload.data.authorizationToken,
      fileName: getFilename(req.file),
      data: req.file.buffer,
      onUploadProgress: (event) => null
    })

    console.log(myfile) // it works

    return myfile

  }
所以我的上传工作,我可以看到我的console.log。所以在我的数据库中,就像第一次上传15秒后,从我的方法发送另一个文件,我的console.log返回我两次

----------最后更新----------

我注意到一些东西,我不知道为什么,但当我的文件大于50mb时。我的函数被调用了2次。在50mb以下,一切正常,我只发送了一次我的文件

如您所见,我添加了console.log(req.file)。结果是:

{
  fieldname: 'file',
  originalname: 'myMovie.mp4',
  encoding: '7bit',
  mimetype: 'video/mp4',
  buffer: <Buffer 1a 45 df a3 01 00 00 00 00 00 00 23 42 86 81 01 42 f7 81 01 42 f2 81 04 42 f3 81 08 42 82 88 6d 61 74 72 6f 73 6b 61 42 87 81 04 42 85 81 02 18 53 80 ... 107390076 more bytes>,
  size: 107390126
}
{
  fieldname: 'file',
  originalname: 'myMovie.mp4',
  encoding: '7bit',
  mimetype: 'video/mp4',
  buffer: <Buffer 1a 45 df a3 01 00 00 00 00 00 00 23 42 86 81 01 42 f7 81 01 42 f2 81 04 42 f3 81 08 42 82 88 6d 61 74 72 6f 73 6b 61 42 87 81 04 42 85 81 02 18 53 80 ... 107390076 more bytes>,
  size: 107390126
}
{
字段名:“文件”,
原名:“myMovie.mp4”,
编码:“7bit”,
mimetype:“视频/mp4”,
缓冲区:,
尺码:107390126
}
{
字段名:“文件”,
原名:“myMovie.mp4”,
编码:“7bit”,
mimetype:“视频/mp4”,
缓冲区:,
尺码:107390126
}

因此,我的两个req.file是相同的

以及被调用的调试消息
,请尝试添加以下内容

console.log(new Error().stack); 

这将帮助您确定冗余/重复呼叫的来源

首先,uploadFile是一个异步函数,所以storage.single代码应该是

storage.single('file')(req、res、async()=>{
console.log('called')
返回等待此.uploadService.uploadFile(req)
})
另外,如果回调向您发回一个错误怎么办

storage.single('file')(req、res、async(err)=>{
如果(错误){
//处理错误
}
console.log('called')
返回等待此.uploadService.uploadFile(req)
})
现在,我不确定您是如何在api中使用它的

根据我之前处理文件上传的方式

函数文件解析器(req、res、opts={}){
返回新承诺((解决、拒绝)=>{
multer({storage:multer.memoryStorage(),…defaultOpts,…opts})
.single(“文件”)(请求、回复、(错误)=>{
如果(错误){
退货拒绝(err);
}
返回resolve();
});
});
}
异步函数fetchAndUploadFile(req、res、opts={}){
等待文件解析器(req、res、opts);
等待uploadService.uploadFile(req);
}
//api路由中的使用
app.post(“/your route”),异步(请求、恢复、下一步)=>{
试一试{
等待fetchAndUploadFile(req,res);
//其他api逻辑和返回响应
}捕捉(错误){
下一个(错误);
}
});

试试这个,如果有帮助请告诉我。另外,您是否使用express或其他类似Feather的框架?(询问原因我在使用feathers框架时看到过类似的查询)

我想我在您更新的代码示例中看到了问题。您没有在
上传文件中将响应发送回客户端
路由处理程序,这会导致浏览器重新发送请求

修改处理程序如下

app.post("/upload-file", async (req, res, next) => {
    try {
        export const inMemoryStorage = (opts = {}) => {
          return multer({ storage: multer.memoryStorage(), ...defaultOpts, 
          ...opts })
         }

        const storage = inMemoryStorage();
        storage.single('file')(req, res, () => {
         console.log(req.file) // in my last update
         console.log('called') // this is returned two times
            await this.uploadService.uploadFile(req);
            res.sendStatus(200); // or equivalent
          })
        } catch (err) {
           next(err);
        }
     });
}

你能发布完整的代码吗?例如,这是什么.uploadService?您可能需要像每个JavaScript用户一样使用分号。理论上,如果您正在执行
const storage=inMemoryStorage()storage.single…
,它可能会自行修复。我做了一个更新,向您展示了我的上传服务。我不认为它是我的分号,因为它在两行上。但是我添加了一个只是为了确定谢谢你的回复,但是我在console.log中没有看到任何可以帮助我的东西。一切正常谢谢你的回复。我尝试了与你的代码完全相同的代码,但我遇到了相同的问题。但我注意到一些东西,我不知道为什么,但当我的文件大于50mb时。我的函数被调用了2次。我只是在我的后端使用express,这很有趣。您能确认在这种情况下API不会被调用两次吗?我想情况可能不是这样,但最好检查一下。如果文件大小大于某个大小,前端可能会将其划分为多个块,并为每个块调用API。不确定,但你可以检查。此外,如果可能的话,我建议使用签名URL上传文件。这样,您将减少对API服务器的压力。您是否将此上载服务置于express应用程序之后?您如何以及何时看到日志消息两次。i、 你们是如何生产的?通过浏览器上传文件吗?如果它位于express应用程序的后面,则可以显示端点实现?感谢您@jeeves的回复,因此它只是一条路线,而不是express中的应用程序。我只是用等待来获取我的数据。我的文件是通过浏览器(chrome)上传的,对于50mb以下的文件来说,一切都很正常。这很奇怪。非常感谢您的帮助,您找到了解决方案!!