使用Express创建数据可视化并从PostgreSQL数据库获取数据

mar*_*lle 8 postgresql node.js express d3.js

我构建了一个Node.js应用程序,它从Internet上删除一些信息并将这些信息保存在postgreSQL数据库中.现在我想使用D3.js创建一些可视化.通常我使用.csv文件创建可视化,但现在我想从我的数据库中获取数据.

我想用Express.js.这是我的代码,它可以工作,但它从.csv文件中获取数据,而不是从数据库获取数据.

app.js:

const express = require('express');
var app = express();

const start = async function() {
    console.log('\n(1) Connect to db');
    await postgreSQLlib.connect();

    console.log('\n(02) Create tables if they do not exist');
    await postgreSQLlib.createTables();

    console.log('\n(03) Check if table \'example\' is updated or not');
    if(!await utilFunc.isTableUpdated('example', 6308)) {
        console.log('\n  (04) Download data for coverages');
        await downloader.download();

        console.log('\n  (05) Elaborate data for example before to save on DB');
        await elaborate.elaborate();

        console.log('\n  (06) Saving data on db');
        await saveOnDb.save();
    }   

    console.log('\n(10) D3js visualizations');
    app.set('port', process.env.PORT || 300)
    var server = app.listen(app.get('port'), function() {
        console.log('Listening on PORT: ' + app.get('port'));
    });
    app.use('/',express.static('public/donut')) 

    // I can't disconnect from db if I have to show visualizations, am I right?
    console.log('\n(11) Disconnect');
    await postgreSQLlib.disconnect();
}

start()
.then(function(res) {
    console.log('Done');
})
.catch(function(err) {
    console.log(err);
});
Run Code Online (Sandbox Code Playgroud)

index.html:

<!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="utf-8">
       <title>Donut</title>
       <script src="https://d3js.org/d3.v3.min.js" charset="utf-8"></script>
       <link rel="stylesheet" type="text/css" href="./donut.css" media="screen"/>
    </head>
    <body>
       <script src="./donut.js"></script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

donut.js:

var width = 960,
    height = 500,
    radius = Math.min(width, height) / 2;

var color = d3.scale.ordinal()
    .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);

var arc = d3.svg.arc()
    .outerRadius(radius - 10)
    .innerRadius(radius - 70);

var pie = d3.layout.pie()
    .sort(null)
    .value(function(d) { return d.population; });

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
  .append("g")
    .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

d3.csv("./data.csv", type, function(error, data) {
  if (error) throw error;

  var g = svg.selectAll(".arc")
      .data(pie(data))
    .enter().append("g")
      .attr("class", "arc");

  g.append("path")
      .attr("d", arc)
      .style("fill", function(d) { return color(d.data.age); });

  g.append("text")
      .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
      .attr("dy", ".35em")
      .text(function(d) { return d.data.age; });
});

function type(d) {
  d.population = +d.population;
  return d;
}
Run Code Online (Sandbox Code Playgroud)

data.csv:

age,population
<5,2704659
5-13,4499890
14-17,2159981
18-24,3853788
25-44,14106543
45-64,8819342
?65,612463
Run Code Online (Sandbox Code Playgroud)

我也尝试:

const start = async function() {
    //...

    function onRequest(req, res) {
        if(req.method == 'GET' && req.url == '/') {
            var client = new pg.Client(conString);
            client.connect();
            var query = client.query('SELECT * FROM example;');
            query.on('row', function(row, result) {
                result.addRow(row);
            });
            query.on('end', function(result) {
                res.status(200)
                res.json(result.rows);
                client.end();
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和:

d3.csv("/", type, function(error, data) {
  if(error) { 
    throw error;
  }
  console.log('data:', data);
  ...
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

我不会使用.csv文件来存储我的数据,但我想使用db.我怎样才能做到这一点?