我应该在哪里进行数据库查询,为什么我没有得到查询结果?

时间:2013-07-01 17:08:13

标签: node.js express

我是node.js和express框架的新手。

有人能告诉我,我是否正确地这样做了?

我创建了一个database.js作为模块,代码包含:

var mysql = require('mysql'),
dateFormat = require('dateformat'),
db = require('./dashboard');

var connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: '',
  database: 'selenium',
  timezone: '-07:00'
});

exports.selectalldate = function() {
  connection.query('SELECT * FROM date', function (err, rows, fields) {
    if (err) {
      console.log(err);
    }
    if(rows.length > 0) {
      for(i = 0; i < rows.length; i ++) {
        rows[i].date = dateFormat(rows[i].date, "yyyy-mm-dd")
      }
      return rows;
    } else {
      return false;
    }
  });
}

我在app.js中需要它,当我调用selectalldate()从app.js中的数据库中获取所有日期时,看看结果是什么。我得到了不确定。我在这里做错了什么?

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path')
  , fs = require('fs')
  , file = __dirname + '/test2'
  , get = require('./routes/get')
  , db = require('./routes/database')
  ;

app.get('/dashboard', function(req, res) {
  var datee = db.selectalldate();
  console.log(datee);
  res.render('dashboard', {title: 'Selenium Dashboard', date: datee});
});

1 个答案:

答案 0 :(得分:1)

那是因为Node的异步性质。所有涉及网络的东西(数据库查询,网络服务等)都是异步的。

因此,您应该重构selectalldate()方法以接受回调。通过该回调,您将能够使用从数据库获取的数据成功呈现模板。

最后,它会是这样的:

exports.selectalldate = function(callback) {
  connection.query('SELECT * FROM date', function (err, rows, fields) {
    if(rows.length > 0) {
      for(i = 0; i < rows.length; i ++) {
        rows[i].date = dateFormat(rows[i].date, "yyyy-mm-dd")
      }
    }

    callback(err, rows);
  });
}

app.get('/dashboard', function(req, res) {
  db.selectalldate(function(err, datee) {
    if (err) {
      // Handle the error in some way!
      return;
    }

    res.render('dashboard', {title: 'Selenium Dashboard', date: datee});
  });
});