我来自一种非常“功能”的编程风格(PHP,Lua,C),我试图将我的想法转换为NodeJS使用的MVC模型。目前,这对我来说是一个非常陡峭的学习曲线。
我一直在试图让一个简单的MySQL数组打印到Jade上,一直撞到墙上。
app.js
/**
* Module dependencies.
*/
var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, http = require('http')
, path = require('path')
, mysql = require('mysql');
var app = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
app.get('/', routes.index);
app.get('/users', user.list);
//MySQL
var sqlInfo = {
host: '12.34.56.78',
user: 'user',
password: 'pass',
database: 'user'
}
var client = mysql.createConnection(sqlInfo);
client.connect();
client.query( "SELECT * FROM list ORDER BY status ASC LIMIT 25", function(err, row, fields){
if (err) throw err;
else {
var applications = row;
app.render("applications", applications, function(err, html){});
}
});
client.end();
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
index.jade
extends layout
block content
div.container
div.content
- if (typeof(applications) !== 'undefined')
ul
- each app in data
li= app.status
- else
p Blank slate mate...
div.footer
我认为我的问题源于app.render / res.render函数......这个函数的概念并没有真正点击,我遇到了问题,就像我在其他许多人看到的那样MySQL + NodeJS示例。
非常感谢任何提示或提示!
答案 0 :(得分:5)
问题是您正在尝试在HTTP流之外呈现查询。 可以是你的意图(在这种情况下,我有兴趣听到你正在尝试用渲染的结果做什么),但通常,你在返回结果之前等待HTTP请求你的查询。
例如:
app.get('/test', function(req, res) {
// connect to MySQL server
var client = mysql.createConnection(sqlInfo);
client.connect();
// Perform query and wait for results
client.query( "SELECT * FROM list ORDER BY status ASC LIMIT 25", function(err, row, fields) {
// Done with the connection
client.end();
// Handle error
if (err) throw err;
else {
// We got a result: render it
var applications = row;
res.render("applications", { applications : applications });
}
});
});
一些指示:
http://localhost:PORT/test
client.end()
之后发送了client.query()
,但没有等待查询返回任何结果。所以我将client.end()
移到了处理查询结果的代码中,以确保仅在返回结果后才结束连接; data
的变量,但我认为应该是applications
; 答案 1 :(得分:1)
在渲染视图时,您可以将变量传递给j:
res.render('index', { applications: applications }, function(err, html){});
然后你可以在index.jade中使用它:
if (typeof(applications) !== 'undefined')
答案 2 :(得分:1)
我可以在这里看到两个问题。
首先,将"applications"
作为第一个参数传递给app.render()。这应该是"index"
以匹配您的视图名称。
其次,这是我认为你缺少的关键点,你需要在传递给app.render()的函数中使用html
做一些事情。
app.render("applications", applications, function(err, html){
//see what you have for html here
});
将函数传递给render后面的想法就像回调一样。您可以检查错误以查看渲染视图是否存在问题。如果没有错误,html
应该具有基于Jade模板的渲染HTML以及您传入的任何数据(applications
)。
如果您仍有问题,我有几点建议。您应该调试数据以查看它的外观。确保MySQL查询以您期望的格式返回数据。然后,您可以查看您的模板是否有效。尝试传入一个简单的数据对象并首先使用一个简单的Jade模板,以确保正确调用app.render()。
我希望有所帮助!