无法让 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 引用数据的主要内容,如果未能解决你的问题,请参考以下文章