redis pub sub not working inside rest api

Viewed 23

I want to use redis pub sub mechanism inside REST api in express framework.Whenever I wrote the subscribe event outside the rest api it's working fine

module.exports = async function (app) {
client.on('error', (err) => console.log('Redis Client Error', err));
await client.connect();

const subscriber = client.duplicate();
await subscriber.connect();

app.get('/test', async (req, res) => {
    console.log('---- inside ----')
    await client.publish('request', 'request-message');
    
    res.json({value:"Ok"})
});
await subscriber.subscribe('response', (message) => {
    console.log(message); // 'message'
    // subscriber.unsubscribe('response');
    // res.json({value:message})
});
}

But if I add the subscribe event inside the Rest Api, then It's not working.

module.exports = async function (app) {
client.on('error', (err) => console.log('Redis Client Error', err));
await client.connect();

const subscriber = client.duplicate();
await subscriber.connect();

app.get('/test', async (req, res) => {
    console.log('---- inside ----')
    await client.publish('request', 'request-message');
    await subscriber.subscribe('response', (message) => {
        console.log(message); // 'message'
        // subscriber.unsubscribe('response');
        res.json({value:message})
    });
});
}

Using pub-sub mechanism I want to connect other servers.But If I add the subscribe event outside the rest api,then I can't send the response to the client.How to achive this process?

1 Answers

Redis PUB/SUB is a fire and forget mecanism so, in the second code snippet you gave, the message is already forgotten when your client subscribes. So you must subscribe before to publish.

module.exports = async function (app) {
client.on('error', (err) => console.log('Redis Client Error', err));
await client.connect();

const subscriber = client.duplicate();
await subscriber.connect();

app.get('/test', async (req, res) => {
    console.log('---- inside ----')
    await subscriber.subscribe('response', (message) => {
        console.log(message); // 'message'
        subscriber.unsubscribe('response');
        res.json({value:message})
    });
    await client.publish('request', 'request-message');
});
}
Related