Redis发布订阅在REST API中不起作用

kq0g1dla  于 2022-09-21  发布在  Redis
关注(0)|答案(1)|浏览(185)

我想在Express框架中使用REST API内部的redis pub Sub机制。当我在REST API外部编写订阅事件时,它工作得很好

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})
});
}

但是如果我在REST Api中添加订阅事件,那么它就不起作用了。

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})
    });
});
}

使用发布-订阅机制,我想连接其他服务器。但如果我在REST API之外添加订阅事件,则无法将响应发送到客户端。如何实现此过程?

bkhjykvo

bkhjykvo1#

Redis酒吧/订阅是一场火灾,忘记了机制,所以,在你给出的第二个代码片段中,当你的客户订阅时,消息已经被忘记了。所以你必须在订阅之前才能发布。

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');
});
}

相关问题