【问题标题】:use HTTP.get to get data posted via HTTP.post in meteor使用 HTTP.get 获取通过 HTTP.post 在流星中发布的数据
【发布时间】:2018-01-20 00:28:15
【问题描述】:

我已经使用 meteorjs 构建了一个应用程序。我需要来自第三方的一些数据。他们会通过 HTTP.POST 方法向我发送数据。

我需要在我的应用程序上监听以查找 http.post 请求。如果我遇到这样的请求,我需要发送一个确认,说明请求已收到,然后我需要提取发送的数据。

我正在使用以下代码,但输出与预期不符。

使用picker包,

var postData = {
"channelName" : "Number Theory1",
"startDate" : "2017-07-22T06:29:35.681Z",
"endDate" : "2017-08-22T06:29:35.681Z"
}
HTTP.call('POST', 'http://localhost:3000', {
   data: postData 
 }, (error, result) => {
 if (error) {
   console.log('we are getting this error:' + error);
 } else {
    console.log('POstres : ' + result);
 }
 }); 
function extractProcessData(data){
   console.log('function called! : ' + data);
}
function confirmDataReceived(data) {
  HTTP.get('http://localhost:3000', function(err, res){
  // confirmation error
  if(err){
    console.log('error ' + err);
  }
  // confirmation success and process data
  else{
    console.log('data : ' + data + res)
    extractProcessData(data) //call function to process data
  }
});
}
var postRoutes = Picker.filter(Meteor.bindEnvironment(function(req, res) {
 if (req.method == "POST"){
   console.log('req : ' + req.method + " " + req.body)
   confirmDataReceived(req.body);
 }
 return true;
 // return req.method == "POST";
}));;;

任何帮助将不胜感激!

干杯!

【问题讨论】:

  • 你为什么要做 Session.set('flag'... 而不是调用一个函数并将你的 if(Session.get.. 包装成一个函数。你需要知道 if(会话...测试目前仅在服务器启动时运行一次。进一步调用修改会话不会再次执行此语句。
  • 好的。所以我需要把 if(session.get()) 部分变成一个函数。然后在调用 session.set 的地方调用该函数,对吗?我的另一个疑问是我不需要 httplistener 来检测 http.post 请求吗?
  • 我提供了我认为必要步骤的答案。您不需要 httplistener,它是您的 Picker 路由器。你也可以运行你自己的监听器,但是如果你已经有了路由(比如 Picker)那就没有必要了,因为所有的请求都通过 Picker 运行

标签: web-services meteor service http-get httplistener


【解决方案1】:

您需要使用中间件库。我过去用过 2 个。

Picker 是最容易实现和使用的东西,就像

Picker.route('/post/:_id', function(params, req, res, next) {
  var post = Posts.findOne(params._id);
  res.end(post.content);
});

https://github.com/meteorhacks/picker

还有更强大的解决方案,Restivus,可以处理身份验证和高级流管理(例如文件上传分块)等,但需要更多工作才能开始。

https://github.com/kahmali/meteor-restivus

【讨论】:

    【解决方案2】:

    据我了解您的要求,该过程应如下所示

    1. 您收到来自第三方的发帖请求
    2. 您需要通过获取请求向第三方确认

    为了做到这一点,我相信你在你的服务器上定义了一个特定的 url 作为端点,并正确过滤你使用 Picker 路由器的那些发布请求(我不太熟悉这个)

    对于第一部分(发布请求),我建议如下:

    var postRoutes = Picker.filter(function(req, res) {
       // here you could be a bit more specific in which
       // post request you are looking for, e.g. check the req.url
       if (req.method == "POST") {
          confirmDataReceived(req.body);
       }
       return true;
    });
    

    然后我们可以进入第二部分,将确认发送给第三方,并使用提供的数据调用您定义的函数进行处理。

    function confirmDataReceived(data) {
      // send the confirmation
      HTTP.get('http://122.160.157.105:3000', function(err, res){
        // confirmation error
        if(err){
            console.log('error ' + err);
        }
        // confirmation success and process data
        else
            fname(data) //call function
        });
    }
    

    【讨论】:

    • 您能否描述更多正在发生的事情以及正在发生的事情,否则很难指导您。我不知道你需要什么第一个 HTTP.call('POST' 因为这是从你的服务器向其他地方发出一个发布请求,如果需要的话我不明白你的初始请求是什么。你有关于您正在尝试使用的 api?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    相关资源
    最近更新 更多