【问题标题】:How to notify a python client from node server?如何从节点服务器通知 python 客户端?
【发布时间】:2019-10-25 16:44:29
【问题描述】:

我有一个节点进程,它当前正在https://company/api/bats_hook/ 接收 POST 请求。我想在有作业时通知 python 进程。我正在使用 node_redis 和 redis-py,实现如下所示。

当节点进程在本地运行时,以下代码在本地运行良好,当我将节点端点推送到服务器时,我似乎没有得到事件?

如何从 python 客户端订阅服务器上的端点?缺什么?我确实在https://company/api/bats_hook/服务器上部署了redis服务器

javascript

    var redis = require("redis"),
    //redisClient = redis.createClient();
    redisClient = redis.createClient({url: process.env.REDIS_URL});

    app.post("/api/bats_holder", (req, res, next) => {
      console.log(req.query.params)
      console.log(req.body)
      console.log(req.body.name)
      // This publishes a message to the "bats hook channel"
      redisClient.publish("bats hook channel", JSON.stringify({
        params: req.query.params,
        body: req.body,
      }));
      res.status(200).json({
        message: "BATS object",
        posts: req.body
      }); 
    });

蟒蛇

    import redis

    r = redis.Redis()
    p = r.pubsub()
    p.subscribe('bats hook channel')

    # This blocks and reads any messages from the "bats hook channel" as they come in
    for message in p.listen():
        print(message)

【问题讨论】:

  • 你能澄清一下 redis 服务器的运行位置,以及你的节点服务器和 python 客户端吗?他们三个是在同一台服务器上运行,还是单独运行?
  • 请同时提供节点脚本中的任何错误日志以及环境配置的用途,例如REDIS_URL 适用于 nodem python 和 redis 进程。
  • 以下是服务器文档Your application will get an environment variable called REDIS_URL, which takes the form of: redis://redisdb:<password>@<host>:<port>/0 Environment Variables REDIS_URL
  • @alex067 - redis 和节点服务器在同一台服务器上运行,python 客户端在我的 mac 上本地运行...
  • @Ritz 然后正如我在回答中提到的那样,您需要使用 REDIS_URL 为它们两者配置通用 Redis。检查它是否有帮助。

标签: python node.js redis node-redis redis-py


【解决方案1】:

那是因为你没有在 python 脚本中配置 Redis URL。这就是为什么它默认使用 localhost 上的端点。使用以下内容更新您的脚本。

import os
import redis

REDIS_URL = os.environ.get('REDIS_URL', 'redis://localhost:6379/0')

r = redis.from_url(REDIS_URL)
p = r.pubsub()
p.subscribe('bats hook channel')

# This blocks and reads any messages from the "bats hook channel" as they come in
for message in p.listen():
    print(message)

documentation 中的更多详细信息和示例。

【讨论】:

  • 我试图弄清楚 REDIS_URL 变量到底是什么,以便我可以在 python 客户端中使用它,我如何从 python 客户端获取它? redis和nodejs在一台服务器上运行,python客户端在自己运行
  • @Ritz 你在哪里运行它(Heroku/AWS/VPS)?你是如何为 Node.js 设置变量的?您需要为 python 脚本设置相同的值。它可以不是环境变量,而是一些配置文件或其他方式。但是我想通过这个答案说 - 你需要提供它。
  • @Ritz 你找到如何设置这个变量并检查它现在是否适合你了吗?
  • 听起来我无法访问服务器外部的 REDIS_URL,python 脚本和 node.js 都应该驻留在服务器上
  • @Ritz 我相信你可以,但你需要弄清楚如何使用你的主机来做到这一点。您可以在 Stackoverflow 上搜索说明或单独提问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 2012-03-30
相关资源
最近更新 更多