我的 dc.js 图表没有显示在我的 Flask 应用程序上并且 mongodb
my dc.js graph is not display on my flask application and mongodb
我正在使用此函数从 MongoDB 中的集合返回一个对象数组:
```
@app.route('/data')
def data():
FIELDS = {'_id': False, 'book_title': True, 'review_rating': True}
projects = mongo.db.reviews.find({}, FIELDS)
json_projects = []
for project in projects:
json_projects.append(project)
json_projects = json.dumps(json_projects, default=json_util.default)
return json_projects
```
当我启动服务器时,我可以看到数据已正确加载(这是来自 google 开发人员工具的控制台)
(3) [{…}, {…}, {…}]
0: {book_title: "Il guardiano degli Innocenti", review_rating: 3}
1: {book_title: "The Lord of the Ring", review_rating: 3}
2: {book_title: "Time of Contempt", review_rating: 4}
length: 3
then I start making my graph in graph.js with this code:
```
queue()
.defer(d3.json, "/data")
.await(makeGraphs);
function makeGraphs(error, projectsJson) {
var ndx = crossfilter(projectsJson);
show_rating_for_title(ndx);
dc.renderAll();
}
function show_rating_for_title(ndx) {
var dim = ndx.dimension(dc.pluck('book_title'));
var group = dim.group();
dc.barChart('#book-rating')
.width(400)
.height(300)
.margins({ top: 10, right: 50, bottom: 30, left: 50 })
.dimension(dim)
.group(group)
.transitionDuration(500)
.x(d3.scale.ordinal())
.xUnits(dc.units.ordinal)
.elasticY(true)
.xAxisLabel('Books title')
}
d3.json('/data').then(data => {
console.log(data)
})
```
This is the HTML:
```
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
<script src="https://kit.fontawesome.com/609714b29a.js" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.1.1/d3.min.js" integrity="sha512-5xkNvFVCctXwOszeifE8pzjyDFlHvHDCKIrhwmuSbCtTHqc7IhA6/1tTNYXE8WmYvwP5KFQegCS1QRR4poYgjg==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crossfilter/1.3.12/crossfilter.min.js" integrity="sha512-nlO6OGj6wb0uu/thpSry7qFal63hfhCLExpWxYomYB3tBznqWmKggsDHNHSLjnVaoade9tv/rErN498NSzwBnA==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dc/4.1.0/dc.min.js" integrity="sha512-lHfUFYGOLmlycQeqF3nxeqIAYf4rdpMCLyp2jbBBR0H+vszlngf7itLg0xDcS8WmO+3TYOcfkQXJXz7rVJ2xbA==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/queue-async/1.0.7/queue.min.js" integrity="sha512-Pizidz0hqpLXeVq+TGqNB5KWVynUPVRTt5shjKBbQIklpnCkdmQJ3rCkzGEe713SAnzIsRt/kFTs4jWG/aPmYA==" crossorigin="anonymous"></script>
<script src="{{ url_for('static', filename='js/graph.js') }}" type="text/javascript"></script>
<title>Bookland</title>
</head>
<body>
<div id="book-rating">
</div>
</body>
```
图表未加载,控制台上未显示任何错误。经过几个小时的研究,我无法理解为什么,请帮帮我。
您的代码混合使用了 d3@3 和 d3@5+,这可能是问题的根源。
D3@5 从回调更改为 Promises。
你的决赛
d3.json('/data').then(data => {
console.log(data)
})
将与 d3@5+ 一起工作,我认为这是您看到返回的正确数据的地方。
另一方面,使用 queue()
的代码和您的图表初始化代码是为与 d3@3(和 dc@2)一起工作而编写的。
不幸的是,如果您尝试将 d3@5 与 queue()
一起使用,那么 什么都不会发生 。正如您在评论中所说,您没有看到错误,但我怀疑这段代码根本没有被命中。
我建议删除 queue()
代码并使用有效的 Promise-based d3.json
代码。
那时你仍然需要升级你的 D3 和 dc.js 代码,但这并不难,主要是将 d3.scale.linear
重命名为 d3.scaleLinear
,与序数相同.
我正在使用此函数从 MongoDB 中的集合返回一个对象数组:
```
@app.route('/data')
def data():
FIELDS = {'_id': False, 'book_title': True, 'review_rating': True}
projects = mongo.db.reviews.find({}, FIELDS)
json_projects = []
for project in projects:
json_projects.append(project)
json_projects = json.dumps(json_projects, default=json_util.default)
return json_projects
```
当我启动服务器时,我可以看到数据已正确加载(这是来自 google 开发人员工具的控制台)
(3) [{…}, {…}, {…}]
0: {book_title: "Il guardiano degli Innocenti", review_rating: 3}
1: {book_title: "The Lord of the Ring", review_rating: 3}
2: {book_title: "Time of Contempt", review_rating: 4}
length: 3
then I start making my graph in graph.js with this code:
```
queue()
.defer(d3.json, "/data")
.await(makeGraphs);
function makeGraphs(error, projectsJson) {
var ndx = crossfilter(projectsJson);
show_rating_for_title(ndx);
dc.renderAll();
}
function show_rating_for_title(ndx) {
var dim = ndx.dimension(dc.pluck('book_title'));
var group = dim.group();
dc.barChart('#book-rating')
.width(400)
.height(300)
.margins({ top: 10, right: 50, bottom: 30, left: 50 })
.dimension(dim)
.group(group)
.transitionDuration(500)
.x(d3.scale.ordinal())
.xUnits(dc.units.ordinal)
.elasticY(true)
.xAxisLabel('Books title')
}
d3.json('/data').then(data => {
console.log(data)
})
```
This is the HTML:
```
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
<script src="https://kit.fontawesome.com/609714b29a.js" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.1.1/d3.min.js" integrity="sha512-5xkNvFVCctXwOszeifE8pzjyDFlHvHDCKIrhwmuSbCtTHqc7IhA6/1tTNYXE8WmYvwP5KFQegCS1QRR4poYgjg==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crossfilter/1.3.12/crossfilter.min.js" integrity="sha512-nlO6OGj6wb0uu/thpSry7qFal63hfhCLExpWxYomYB3tBznqWmKggsDHNHSLjnVaoade9tv/rErN498NSzwBnA==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dc/4.1.0/dc.min.js" integrity="sha512-lHfUFYGOLmlycQeqF3nxeqIAYf4rdpMCLyp2jbBBR0H+vszlngf7itLg0xDcS8WmO+3TYOcfkQXJXz7rVJ2xbA==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/queue-async/1.0.7/queue.min.js" integrity="sha512-Pizidz0hqpLXeVq+TGqNB5KWVynUPVRTt5shjKBbQIklpnCkdmQJ3rCkzGEe713SAnzIsRt/kFTs4jWG/aPmYA==" crossorigin="anonymous"></script>
<script src="{{ url_for('static', filename='js/graph.js') }}" type="text/javascript"></script>
<title>Bookland</title>
</head>
<body>
<div id="book-rating">
</div>
</body>
```
图表未加载,控制台上未显示任何错误。经过几个小时的研究,我无法理解为什么,请帮帮我。
您的代码混合使用了 d3@3 和 d3@5+,这可能是问题的根源。
D3@5 从回调更改为 Promises。
你的决赛
d3.json('/data').then(data => {
console.log(data)
})
将与 d3@5+ 一起工作,我认为这是您看到返回的正确数据的地方。
另一方面,使用 queue()
的代码和您的图表初始化代码是为与 d3@3(和 dc@2)一起工作而编写的。
不幸的是,如果您尝试将 d3@5 与 queue()
一起使用,那么 什么都不会发生 。正如您在评论中所说,您没有看到错误,但我怀疑这段代码根本没有被命中。
我建议删除 queue()
代码并使用有效的 Promise-based d3.json
代码。
那时你仍然需要升级你的 D3 和 dc.js 代码,但这并不难,主要是将 d3.scale.linear
重命名为 d3.scaleLinear
,与序数相同.