Promise 好像不是在调用 resolve

Promise does not seem to be calling resolve

我有以下代码:

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)) 条件。没有错误被抛出,只是什么也没有发生。我在这里做错了什么?

您对 Promises 的使用不正确。 multerUploadWorker 应该 return 承诺,但在你的情况下 return 没什么。

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;

还有你处理结果的方式,不需要检查结果,因为你不是 returning 布尔值,只需等待上传完成,以防在 catch 中处理错误声明:

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