NodeJS-Promise在Redis池中返回未定义的对象

时间:2018-10-24 06:05:44

标签: node.js redis promise

我有一个从redis-connection-pool创建的Redis池对象。它寻找一个密钥来获取所有图像标识符的数组。然后,对于每个元素,都将查找另一个Redis键,以便将值附加到一个JSON对象中。返回该对象作为对GET请求的响应。

由于某些奇怪的原因(也许是Redis错误?),当Promise用正确的数据解析时,使用该Promise的函数始终会看到一个undefined对象。

原始尝试

async function allImageData() {
    var configPool = redisPools.configPool;
    var resp = {};
    var images = [];
    var imageDetails = {};
    //
    await configPool.get('allImages', async (err, reply) => {
        if (err) {
            resp = {
                'data': {}
            }
            reject(resp)
        } else {
            if (reply === null) {
                resp = {
                    'data': {}
                }
                reject(resp)
            } else {
                imageDetails = JSON.parse(reply)
                images = imageDetails['allImages']
                return new Promise(function (resolve, reject) {
                    imageDetailsCache(images).then(function (result) {
                        resp = {
                            'data': result
                        }
                        resolve(resp) //Correct data; but, received as undefined
                    }).catch(function (result) {
                        resp = {
                            'data': {}
                        }
                        reject(resp)
                    })
                })
            }
        }
    })
}

下一次尝试

Redis get结束后将返回承诺。

async function allMachineData() {
    var configPool = redisPools.configPool;
    var resp = {};
    var images = [];
    var imageDetails = {};
    //
    await configPool.get('allImages', async (err, reply) => {
        if (err) {
            resp = {
                'data': {}
            }
            reject(resp)
        } else {
            if (reply === null) {
                resp = {
                    'data': {}
                }
                reject(resp)
            } else {
                imageDetails = JSON.parse(reply)
                images = imageDetails['allImages']
            }
        }
    })
    return new Promise(function (resolve, reject) {
        // images array is empty; so, received as empty object
        imageDetailsCache(images).then(function (result) {
            resp = {
                'data': result
            }
            resolve(resp)
        }).catch(function (result) {
            resp = {
                'data': {}
            }
            reject(resp)
        })
    })
}

1 个答案:

答案 0 :(得分:0)

尝试使用

await configPool.get('allImages', async (err, reply) => {

首先,.get不会返回承诺,因此await设置没有任何意义
其次,您不在回调中使用await,因此无需使其async

似乎可以简化您的代码

首先,由于您要返回一个Promise,所以将configPool.get包装在一个Promise中,该Promise将在回调中被解决/拒绝

在那之后,这只是一个承诺链的问题,因为您的代码暗示imageDetailsCache返回了一个承诺,所以很简单:

function allImageData() {
    return new Promise((resolve, reject) => {
        redisPools.configPool.get('allImages', (err, reply) => err ? reject(err) : resolve(reply));
    })
    .then(reply => {
        if (reply === null) return Promise.reject(null);
        const imageDetails = JSON.parse(reply);
        return imageDetailsCache(imageDetails.allImages);
    })
    .then(data => ({data}))
    .catch(() => Promise.reject({data:{}}));
}