【问题标题】:Meteor fetch server-side job without collectionMeteor 获取服务器端作业而不收集
【发布时间】:2017-06-30 02:50:47
【问题描述】:

我想从 Meteor 客户端向服务器提交一个请求,让服务器向网站发出 HTTP 请求,然后将响应返回给客户端。

在 REST Web 服务器上,我会从客户端向服务器发送 HTTP GET,然后服务器会发出自己的请求并响应客户端。

我还没有在我的 Meteor 应用程序中添加 REST 接口,并且不想仅仅为了这个需求而添加这个开销。但是,使用集合来完成这项工作很笨拙,而且不是正确的工具。

Meteor 客户端有什么方法可以安全地请求服务器做某事并获得响应而不使用集合?我在搞乱流星的方法比如:

Meteor.methods({
    '/http/get'(name, cbk) {
        cbk = cbk || function() {};
        HTTP.get('http://www.google.com', {}, (err, data) => {
            cbk(err, data);
        });
    },
});

但这似乎不起作用。正在客户端进行调用。

【问题讨论】:

    标签: rest meteor


    【解决方案1】:

    这正是 Meteor 方法的用途。

    Meteor methods docs

    服务器 首先在你的服务器上定义你的方法:

    Meteor.methods({
        // Namespace for clarity
        'make.rest_call'(callback) {
            HTTP.get('http://www.google.com', {}, (err, data) => {
                callback(err, data);
            });
        }
    });
    

    如果您需要客户端处理数据,请在此处返回承诺 (promise docs)

    Meteor.methods({
        // Namespace for clarity
        'make.rest_call'(callback) {
            return new Promise((resolve, reject) => { 
                HTTP.get('http://www.google.com', {}, (err, data) => {
                    if (err) { reject(err); }
                    resolve(data);
                });
            }
        }
    });
    

    客户 然后从您的客户那里调用它:

    // Simple call (just makes the call, does nothing on the client)
    Meteor.call('make.rest_call');
    

    // Promise based call
    Meteor.call('make.rest_call', (error, result) => {
        if (error) { /* do something with error */ }
    
        // result contains your promise.
        result.then((data) => {
            // do something with returned data
        });
    });
    

    【讨论】:

    • 谢谢!但是,当我尝试此操作时,客户端会尝试发出 HTTP 请求以及服务器,并收到 CORS 错误。如何让服务器尝试发出 HTTP 请求,然后将其返回给客户端?
    • 我目前通过在 HTTP 请求中添加一个 try / catch 来实现这个功能,但这似乎很糟糕。
    • 您不能从现代 Web 客户端发出跨源请求,除非查询的源具有特殊的标头。这并不总是可行或可行的,这就是我们只需要从服务器进行此调用的原因。我已经准确地标记了每一位代码的去向,这应该更容易理解。
    • 哦,所以我从来没有在客户端上定义方法?我一直在客户端和服务器加载的文件中定义我的方法。我认为这是必需的。
    • 嗯,这就解释了为什么它执行了两次;)。从这里开始,一切都应该走下坡路。
    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 2014-08-09
    • 2015-04-28
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2014-11-08
    相关资源
    最近更新 更多