微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 如何使用NodeJS ExpressJS将数组传递给Jade进行显示?

我来自一个非常“功能”的编程风格(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示例中看到的一样.

任何提示提示非常感谢!

解决方法:

问题是您正在尝试在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来查看结果
>查看connection pooling for MysqL,它维护一个MysqL服务器连接的池,而不是每次处理请求时都必须创建一个新连接;
>在您的示例代码中,您正在client.query()之后发送client.end(),但不等待查询返回任何结果.所以我将client.end()移动到处理查询结果的代码内部,以确保仅在返回结果后才结束连接;
>在你的模板中,你引用了一个名为data的变量,但我认为应该是应用程序;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐