3

我来自一种非常“功能性”的编程风格(PHP、Lua、C),我正试图将我的想法转变为 NodeJS 使用的 MVC 模型。目前,这对我来说是一个非常陡峭的学习曲线。

我一直在努力尝试将一个简单的 MySQL 数组打印到 Jade。

应用程序.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'));
});

索引.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 中看到的那样例子。

非常感谢任何提示或提示!

4

3 回答 3

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
  • 看看MySQL 的连接池,它维护一个与 MySQL 服务器的连接池,而不是每次处理请求时都必须创建一个新连接;
  • 在您的示例代码中,您在client.end()之后立即发送client.query(),但没有等待查询返回任何结果。所以我移到client.end()处理查询结果的代码内部,以确保只有在返回结果后才结束连接;
  • 在您的模板中,您引用了一个名为 的变量data,但我认为应该是applications;
于 2013-04-25T05:28:30.207 回答
1

您可以在渲染视图时将变量传递给翡翠,如下所示:

res.render('index', { applications: applications }, function(err, html){});

然后你可以在你的 index.jade 中使用它:

if (typeof(applications) !== 'undefined')
于 2013-04-25T04:03:03.363 回答
1

我可以在这里看到两个问题。

首先,您将"applications"作为第一个参数传递给 app.render()。这可能应该"index"与您的视图名称相匹配。

其次,这是我认为您缺少的关键点,即您需要html在传递给 app.render() 的函数中做一些事情。

app.render("applications", applications, function(err, html){
    //see what you have for html here
});

将函数传入渲染背后的想法是它像回调一样工作。您可以检查 err 以查看渲染视图是否存在问题。如果没有错误,html应该有基于 Jade 模板和您传入的任何数据的渲染 HTML ( applications)。

如果您仍然有问题,我有几个建议。您可能应该调试您的数据以查看其外观。确保 MySQL 查询以您期望的格式返回数据。然后您可以查看您的模板是否有效。尝试传入一个简单的数据对象并首先使用一个简单的 Jade 模板,以确保您正确调用 app.render()。

我希望这会有所帮助!

于 2013-04-25T05:28:07.617 回答