【问题标题】:Promise does not seem to be calling resolvePromise 似乎没有调用 resolve
【发布时间】:2020-10-12 03:54:18
【问题描述】:

我有以下代码:

const multer = require('multer');

const multerUploadWorker = async(req, res, storage) => {
    console.log('worker called');
    
    const upload = multer({ storage: storage }).single('file');

    upload(req, res, function (error) {
        if (error) {
            return Promise.reject();
        } else {
            console.log('resolve called');
            return Promise.resolve();
        }
    });
};

module.exports = multerUploadWorker;

和:

const { success, fail } = require('../utils/response-util');
const multer = require('multer');
const multerUploadWorker = require('../workers/multer-upload-worker');
const path = require('path');

const upload = async(req, res) => {

    const storage = multer.diskStorage({
        destination: function (_, _, cb) {
            cb(null, 'uploads/')
        },

        filename: function (_, file, cb) {
            const ext = path.extname(file.originalname);

            switch (ext) {
                case '.jpg':
                case '.JPG':
                case '.jpeg':
                case 'JPEG':
                case '.png':
                case '.PNG':
                case '.gif':
                case '.GIF':
                    cb(null, Date.now() + ext);
                    break;
                default:
                    cb('File type error', false);
                    break;
            }
        }
    });


    try {
        if (await multerUploadWorker(req, res, storage)) {
            return success(res, { message: req.file });
        }
    } catch(error) {
        return fail(
            res, 'Something went wrong, please check the image type is \
JPEG, GIF or PNG', '500'
        );
    }
};

module.exports = {
    upload
};

似乎虽然控制台在multerUploadWorker 中记录了resolve called,但它并没有触发if (await multerUploadWorker(req, res, storage)) 条件。没有错误被抛出,只是没有任何反应。我在这里做错了什么?

【问题讨论】:

  • 返回内部函数不会返回外部函数

标签: javascript express multer


【解决方案1】:

您对 Promise 的使用不正确。 multerUploadWorker 应该返回承诺,但在你的情况下它什么也不返回。

const multer = require('multer');

const multerUploadWorker = async(req, res, storage) => {
    console.log('worker called');
    
    const upload = multer({ storage: storage }).single('file');

    return new Promise((resolve, reject) => {
        upload(req, res, function (error) {
        if (error) {
            reject(error)
        } else {
            console.log('resolve called');
            resolve();
        }
      });
    });
};

module.exports = multerUploadWorker;

同样是你处理结果的方式,不需要检查结果,因为你没有返回布尔值,只需等待上传完成,如果catch语句中出现错误处理:

    try {
       await multerUploadWorker(req, res, storage))
       return success(res, { message: req.file });
    }

【讨论】:

  • 我不熟悉 multer 库,不知道 upload 是返回 Promise 还是基于回调。
  • multer 是基于回调的
  • 为什么我错误地使用了 Promise?这是一个异步函数,我返回一个用于拒绝,一个用于解决。我也试过你的代码,结果完全一样。
  • @Kex 异步函数应该返回 Promise,在您的情况下,它不返回任何内容,这被视为您立即返回 undefined 而无需等待实际上传发生。
  • @Kex 我已经编辑了答案以包括有关使用的调整。
猜你喜欢
  • 1970-01-01
  • 2020-05-31
  • 2019-01-20
  • 2018-03-27
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多