使用等待和异步处理承诺

时间:2020-09-01 04:05:40

标签: javascript node.js

我正在使用this库进行文件上传。这里说

 sampleFile.mv('/somewhere/on/your/server/filename.jpg', function(err) {
    if (err)
      return res.status(500).send(err);

    res.send('File uploaded!');
  });

但是我想通过await和async使用它,所以当我尝试

router.put("/upload", async(req,res)=>{
    const isUploaded = await sampleFile.mv('/somewhere/on/your/server/filename.jpg');
    console.log(isUploaded) // it gives me undefined over here.
});

2 个答案:

答案 0 :(得分:1)

我已经遍历了您正在使用的库的.mv()代码。 它确实有希望的支持。

但是,它似乎使用空参数来解决()。

因此,如果要使用异步等待,可以使用

router.put("/upload", async(req,res)=>{
    try{
         await sampleFile.mv('/somewhere/on/your/server/filename.jpg');
         res.send('File uploaded!');
    } catch(err){
         res.status(500).send(err);
});

您不能使用

const isUploaded = await mvPromise('/somewhere/on/your/server/filename.jpg');

它将始终是未定义的,因为它不返回任何内容。

答案 1 :(得分:1)

当没有提供回调时,图书馆支持promises,因此您应该可以等待它

资源:https://github.com/richardgirges/express-fileupload/blob/1216f4f0685caca7f1ece47f52c6119dc956b07d/lib/fileFactory.js#L62

要访问在中间件中创建的正确文件,您需要查看请求。同样,函数mv的响应不应返回任何内容。只要不扔就可以了。

    app.post("/upload", async (req, res) => {
      if (!req.files || Object.keys(req.files).length === 0) {
        return res.status(400).send("No files were uploaded.");
      }

      // The name of the input field (i.e. "sampleFile") is used to retrieve the uploaded file
      let { sampleFile } = req.files;

      // Use the mv() method to place the file somewhere on your server
      try {
        await sampleFile.mv("/somewhere/on/your/server/filename.jpg");
        res.send("File uploaded!");
      } catch (e) {
        res.sendStatus(500);
      }
    });