无法让 falcor 路由器通过 sidecar 使用外部 API 引用数据

Posted

技术标签:

【中文标题】无法让 falcor 路由器通过 sidecar 使用外部 API 引用数据【英文标题】:Having trouble getting falcor router to reference data using an external API through sidecar 【发布时间】: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"]

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

谢谢

【问题讨论】:

【参考方案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"
      
   

【讨论】:

以上是关于无法让 falcor 路由器通过 sidecar 使用外部 API 引用数据的主要内容,如果未能解决你的问题,请参考以下文章

Falcor 路由器无法解析 $ref

为深度路径构建 falcor 路由器的有效方法?

如何在 Falcor 中查找单个项目

有哪些 Falcor 路由器实施方案?

在传统 REST API 数据源和 Falcor 客户端之间优化 node.js falcor 路由器

适当的 Falcor 架构会导致单片路由器吗?