【问题标题】:Having trouble getting falcor router to reference data using an external API through sidecar无法让 falcor 路由器通过 sidecar 使用外部 API 引用数据
【发布时间】:2016-06-24 03:21:56
【问题描述】:

为了测试功能,我设置了一些 Netflix OSS 微服务(Eureka、Falcor sidecar)以及一个非常基本的 Falcor 设置。我正在尝试从 Falcor 的客户端调用外部 API,其端点是 http://localhost:8001/customer/customers。在我的index.js 文件中,我有:

app.use('/model.json', falcorExpress.dataSourceRoute(function (req, res) {
return new falcorRouter([
    {
        route: "customers.length",
        get: function (pathset) {
            return http.get("http://localhost:8001/customer/customers")
                .then(function (json) {
                    return {
                        path: pathset,
                        value: $atom(json.length)
                    };
                });
        }
    }
   ]);
}));

然后在我的客户端index.html:

<html>
 <head>
  <script src="js/falcor.browser.js"></script>
  <script>
    var model = new falcor.Model({source: new falcor.HttpDataSource('/model.json') });
    model.
    get("customers.length").
    then(function(response) {
        console.log(response);
    });
  </script>
 </head>
<body>
</body>
</html>

如果我手动点击http://localhost:8001/customer/customers API,我会得到一个这样的 JSON 对象:

[
  {
    "customerId": 1,
    "customerName": "Pierre"
  },
  {
    "customerId": 2,
    "customerName": "Paula"
  }
]

但是,我的console.log 正在输出这样的错误对象:

[{path: ["customers","length"],
  value: {message: "undefined is not a function"}}]

在这个阶段我对我返回的格式对象不太感兴趣,我只是想要一些可以玩的东西。如何修改我的路由器以获取我期望的数据?

谢谢

【问题讨论】:

    标签: node.js falcor falcor-router


    【解决方案1】:

    你应该试试这个...

    服务器

        // index.js
    var falcorExpress = require('falcor-express');
    var Router = require('falcor-router');
    
    var express = require('express');
    var app = express();
    var fs = require("fs");
    var q = require("q");
    
    app.use('/model.json', falcorExpress.dataSourceRoute(function(req, res) {
        var jdata;
    
        function getJson() {
            var defer = q.defer();
            fs.readFile(__dirname + "/" + "abc.json", 'utf8', function(err, data) {
                // console.log(data);
                if (err) {
                    defer.reject(err);
                } else {
                    jdata = JSON.parse(data);
                    defer.res
                    defer.resolve(jdata);
                }
            });
            return defer.promise;
        }
    
        return new Router([
            {
                // match a request for the key "falcor.greeting"    
                route: "falcor.greeting",
                get: function() {
                    return { path: ["falcor", "greeting"], value: "hello" };
                }
            },
            {
                // match a request for the key "fa.greeting"
                route: 'fa.greeting',
                get: function() {
                    return getJson().then(function(data) {
                        console.log(data.fa.greeting);
                        return { path: ["fa", "greeting"], value: data.fa.greeting };
                    }, function(error) {
                        console.log(error);
                        return error;
                    });
                }
            },
            {
                // match a request for the key "sa.ga"
                route: 'sa.ga',
                get: function() {
                    return getJson().then(function(data) {
                        console.log(data.sa.ga);
                        return { path: ["sa", "ga"], value: data.sa.ga };
                    }, function(error) {
                        console.log(error);
                        return error;
                    });
                }
            }
        ]);
    }));
    
    // serve static files from current directory
    app.use(express.static(__dirname + '/'));
    
    var server = app.listen(8008, function(err) {
        if (err) {
            console.error(err);
            return;
        }
        console.log("navigate to http://localhost:8008");
    });
    

    客户

    <!-- index.html -->
    <html>
    
    <head>
        <!-- Do _not_  rely on this URL in production. Use only during development.  -->
        <script src="//netflix.github.io/falcor/build/falcor.browser.js"></script>
        <script>
            var model = new falcor.Model({
                source: new falcor.HttpDataSource('/model.json')
            });
    
            //logging:
            var log = console.log.bind(console);
            var jlog = function(x) {
                console.log(JSON.stringify(x, null, 3));
            };
            var jerror = function(x) {
                console.error(JSON.stringify(x, null, 3));
            };
    
    
            model.get("falcor.greeting").then(jlog, jerror)
    
            model.get("fa.greeting").then(jlog, jerror)
    
            model.get("sa.ga").then(jlog, jerror)
        </script>
    </head>
    
    <body>
    </body>
    
    </html>
    

    JSON 文件

    {
        "fa": {
            "greeting": "Hello World"
        },
        "sa": {
            "ga": "ha"
        }
    }
    

    在浏览器控制台上的输出

    {
       "json": {
          "falcor": {
             "greeting": "hello"
          }
       }
    }
    (index):15 {
       "json": {
          "fa": {
             "greeting": "Hello World"
          }
       }
    }
    (index):15 {
       "json": {
          "sa": {
             "ga": "ha"
          }
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-27
      • 2016-05-17
      • 2016-07-25
      • 2016-02-12
      • 2018-03-25
      • 2013-10-20
      • 2017-03-02
      • 2015-12-31
      • 2020-03-16
      相关资源
      最近更新 更多