我是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});
});
答案 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});
});
});