JSON 值返回为 'undefined' 尽管在 nodeJS 和 SQLite3 中格式正确

JSON value returning as 'undefined' despite being well formed in nodeJS and SQLite3

我正在尝试对 SQLite 数据库执行多个异步请求,然后使用 node/express 和 ejs 模板将它们呈现在网页中。我能够从数据库请求中检索 JSON 中的数据,但是当将其推送到另一个 JSON 对象时,它返回为未定义。

app.js

//Set up web server
const express = require('express');
const app = express();
var dashboard = require('./dashboard.js');
var async = require('async');

//Set view engine and allow access to public/css
app.set('view engine', 'ejs');
app.use(express.static('public/css'));

//Start server
app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
})

//Connect to database
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('fishtank.db');

//Home page
app.get('/', function(req, res) {

    //Temps variables
    var currentAmbientTemp = '18.2';
    var lightStatus = 'OFF';
    var airPumpStatus = 'OFF';


    //Get temps from database
    var tempHistoryQuery = "SELECT * FROM watertemp LIMIT 5";
    var currentWaterTempQuery = "SELECT temp FROM watertemp LIMIT 1";

    async.series({
        tempHistory: function(callback){
            db.all(tempHistoryQuery, (err, results)=> {
                callback(results);
            })
        },
        currentWaterTemp: function(callback){
            db.all(currentWaterTempQuery, (err, results)=> {    
                callback(results);          
            })
        }
    },function(err, results) {
        res.render('index', { 
            tempHistory: results['tempHistory'],
            currentWaterTemp: results['currentWaterTemp'],
            currentAmbientTemp: currentAmbientTemp,
            lightStatus: lightStatus,
            airPumpStatus: airPumpStatus
        })
        console.log(results);
    });

});

index.ejs

<!-- views/pages/index.ejs -->
<!DOCTYPE html>
<html lang="en">
<head><% include partials/head %></head>

<body class="container">

  <!--HEADER-->
  <header><% include partials/header %></header>

  <!--MAIN BODY-->
  <main>

    <!--OVERVIEW SECTION-->   
    <div class="row">

      <div class="col-md-12 dash-section">
        <h3>Overview</h3>
      </div>

      <!--WATER TEMP-->
      <div class="col-md-3 dash-panel">
        <div class="panel panel-info">
          <div class="panel-heading">WATER TEMP</div>
          <div class="panel-body"><%= currentWaterTemp %>&deg;C</div>
        </div>
      </div>

      <!--AMBIENT TEMP-->
      <div class="col-md-3 dash-panel">
        <div class="panel panel-info">
          <div class="panel-heading">AMBIENT TEMP</div>
          <div class="panel-body"><%= currentAmbientTemp %>&deg;C</div>
        </div>
      </div>

      <!--LIGHT STATUS-->
      <div class="col-md-3 dash-panel">
        <div class="panel panel-info">
          <div class="panel-heading">LIGHT STATUS</div>
          <div class="panel-body"><%= lightStatus %></div>
        </div>
      </div>

      <!--AIR PUMP STATUS-->
      <div class="col-md-3 dash-panel">
        <div class="panel panel-info">
          <div class="panel-heading">AIR PUMP STATUS</div>
          <div class="panel-body"><%= airPumpStatus %></div>
        </div>
      </div>
    </div>

    <!--DETAILS SECTION-->
    <div class="row">

      <div class="col-md-12 dash-section">
        <h3>Details</h3>
      </div>

      <!--WATER TEMP DETAILS-->
      <div class="col-md-4">
        <div class="panel panel-default">
        <div class="panel-heading"><strong>WATER TEMP HISTORY</strong></div>
          <table class="table table-bordered">
            <thead>
              <tr>
                <th scope="col">Date/Time</th>
                <th scope="col">Temp</th>
              </tr>
            </thead>
            <tbody>
              <% for(var i=0; i < tempHistory.length; i++) { %>
                <tr>
                  <td><%= tempHistory[i].datetime %></td>
                  <td><%= tempHistory[i].temp %></td>
                </tr>
              <% } %>
            </tbody>
          </table>
        </div>
      </div>

      <!--AMBIENT TEMP DETAILS-->
      <div class="col-md-4 ml-auto">
        Ambient Temp Table
      </div>

      <!--TBC DETAILS-->
      <div class="col-md-4 ml-auto">
        TBC
      </div>

    </div> <!--End of row-->
  </main>

  <!--FOOTER-->
  <footer><% include partials/footer %></footer>

</body>
</html>

console.log(results); 给我:

{ tempHistory: undefined }

但是当从回调函数中记录它时,我得到:

[ { id: 1, datetime: '2018-02-24 12:56:02.123456', temp: 29.5 },
  { id: 2, datetime: '2018-02-24 13:56:02.123456', temp: 28.5 },
  { id: 3, datetime: '2018-02-24 14:56:02.123456', temp: 26.5 },
  { id: 4, datetime: '2018-02-24 15:56:02.123456', temp: 26.7 },
  { id: 5, datetime: '2018-02-24 16:56:02.123456', temp: 25.9 } ]

如有任何帮助,我们将不胜感激。

编辑

我现在怀疑你打错电话了。 callback的第一个参数应该是错误,结果应该是第二个参数。见下文:

async.series({
  tempHistory: function (callback) {
    db.all(tempHistoryQuery, (err, results)=> {
      callback(err, results);
    })
  },
  currentWaterTemp: function (callback) {
    db.all(currentWaterTempQuery, (err, results) => {    
      callback(err, results);          
    })
  }
},function (err, results) {
    // Don't forget to check for error here.
});

可以简化为:

async.series({
  tempHistory: cb => db.all(tempHistoryQuery, cb),
  currentWaterTemp: cb => db.all(currentWaterTempQuery, cb)
}, (err, results) => {
    // ..
});

参考.series

的示例代码