使用以下路线考虑以下香草api资源:
`POST` `{{baseurl}}/api/v1/users`
//with request body of
{
"username":"adam12",
"password":"abc123"
}
`GET` `{{baseurl}}/api/v1/users`
`GET` `{{baseurl}}/api/v1/users/:id`
`PUT` `{{baseurl}}/api/v1/users/:id`
`DELETE` `{{baseurl}}/api/v1/users/:id`
其中{{baseurl}}
是localhost:3000
。
我在这里有一个有效的实现代码:https://github.com/mmcguff/webhookLearning
在这一点上,与此users
资源进行交互的客户端必须发送GET
请求,以便了解对此资源的更改。如果需要此资源的实时数据,则必须创建一个轮询循环,该循环将消耗服务器上两个客户端上的资源,以响应这些请求。
我知道解决此问题的正确方法是为此资源实现Webhook订阅,但是我在node.js中找不到关于如何执行此操作的明确的最佳实践类型信息。我在npm中发现的软件包目前下载量很少,这使我相信必须有一种更好的方式供他人使用。
从原始API到Webhook API的迁移方面的任何帮助都对我和社区中的每个人都非常有用。
答案 0 :(得分:1)
通常将队列用于此类事情。例如,GitHub很久以前就为Ruby开源了一个名为resque的Ruby。特别是在Node中,您可以查看bull。 Bull使用Redis来存储类似于resque的排队事件。员工订阅他们关心的事件并进行相应处理。
现在为您的用例提供一个实用但有限的示例:
const Queue = require('bull');
const rp = require('request-promise');
const userQueue = new Queue('user');
app.post(`/v1/users`, (req, res) => {
userQueue.add({username: req.body.username, email: req.body.email});
return res.send(`OK`);
});
const userSubscribers = [
{
hookUrl: `http://example.com/user-hook`
}
];
userQueue.process(job => {
return Promise.all(userSubscribers.map(subscriber => {
const options = {
method: `POST`,
uri: subscriber.hookUrl,
body: job.data,
json: true
};
return rp(options);
});
});
对于其他折衷方案,可以使用Kafka代替webhooks。