首页 > 初学者:ejs+express怎么从数据库获取数据并输出至网页?

初学者:ejs+express怎么从数据库获取数据并输出至网页?

我是看教程学习的,做一个简易评论区,但教程中只说了如何提交数据,但没说如何获取。现在一头雾水。
流程应该是:a.启动(app.js)-->b.查询(bbs_a.js)-->c.路由(routes/bbs.js)-->d.显示(views/bbs.ejs)
但是不知道如何具体操作,对这几个步骤之间的关系也不甚清楚,网上的教程都是含糊带过,有朋友能讲解一下吗?非常感谢!

这是我写的代码
更新bbs_a.js,旧的是我单独摘出来的read,实际上有save和read

app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');

var routes = require('./routes/index');
var bbs = require('./routes/bbs');


var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/bbs', bbs);
app.listen(8000);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});


module.exports = app;


在这里,我把存储数据和读取数据放在一起。但数据库操作很奇怪……不知道怎么操作才合理

bbs_a.js

var mysql = require('mysql');

var pool = mysql.createPool({
    host: '127.0.0.1',
    port: '3306',
    user: 'root',
    password: '',
    database: 'sinatest'
});

function Comment() {};
module.exports = Comment;

pool.on('connection', function(connection) {
    connection.query('SET SESSION auto_increment_increment=1');
});

pool.getConnection(function(err, connection) {
    Comment.prototype.readComment = function (callback){
        pool.query('SELECT comment FROM bbs', function(err, result) {
            console.log("invoked[readComment]");
            callback(err, result);
        });
    }
});

bbs.js

var express = require('express'),
    router = express.Router(),
    Comment = require('../bbs_a.js'),
    TITLE_REG = '评论区';

router.get('/', function(req, res) {
    console.log("1");
    var comment = new Comment();
    comment.readComment(function(err, result) {
        if (err) {
            console.log("2");
            res.status(404).end(err);
        } else {
            console.log("3");
            res.render('bbs', {
                items: result
            });
        }
    });
});

bbs.ejs

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
  <body>     
      <hr>
      <h1>评论区</h1>

      <ul>
    <% for(var i=0; i<item.length; i++) { %>
        <li><%=item[i].comment %></li>
    <% } %>
</ul>
  </body>
</html>

ps:我是看这个教程 http://www.cnblogs.com/zhongweiv/category/539147.html 学习的。写得很棒,特别是示例比较详细,而不只是讲原理。但并不能解决我的问题……


你应该有些js没有写:module.exports = router;


简单来一发:
bbs.js

var express = require('express'),
    router = express.Router(),
    Comment = require('../bbs_a.js'),
    TITLE_REG = '评论区';

router.get('/', function(req, res) {
    var user = new User();//这里主要看你的构造方法是需要什么参数的
    user.read(function(err,result){
        if(err) {
            res.status(404).end(err);
        }else{
             res.render('bbs', {
                 items: result
             });
        }
    });
});

bbs.ejs



<ul> <% for(var i=0; i<items.length; i++) { %> <li><%=items[i].comment %></li> <% } %> </ul>

没测试过大致就是这样,有问题,留言


1.在bbs_a.js,你需要导出一个对象User

module.exports = User;

2.在bbs.js中,需要引入bbs_a.js的对象

var User = require('bbs_a');

3.调用User.read方法,获取数据

router.get('/', function(req, res) {
    var comment = User.read ...       //调用数据库方法,获取数据
    res.render('bbs', {
        comment: comment              //赋值,传到前台
    });
});

吐槽下,你的数据库方法有点奇怪啊。。。

User.prototype.read = function read(callback)...

修改成这样后,为什么还是会报错呢?

bbs_a.js

var mysql = require('mysql');

var pool = mysql.createPool({
    host: '127.0.0.1',
    port: '3306',
    user: 'root',
    password: '',
    database: 'sinatest'
});

function Comment() {};
module.exports = Comment;

pool.on('connection', function(connection) {
    connection.query('SET SESSION auto_increment_increment=1');
});

pool.getConnection(function(err, connection) {

    Comment.readComment = function readComment(callback) {
        pool.query('SELECT comment FROM bbs', function(err, result) {
            console.log("invoked[readComment]");
            callback(err, result);
        });
    }
});

bbs.js

var express = require('express'),
    router = express.Router(),
    Comment = require('../bbs_a.js'),
    TITLE_REG = '评论区';

router.get('/', function(req, res) {
    var comment = new Comment();
    comment.readComment(function(err,result){
        if(err) {
            res.status(404).end(err);
        }else{
             res.render('bbs', {
                 items: result
             });
        }
    });
});

运行后报错:

G:\iamhere\bbs2\node_modules\express\lib\router\index.js:446
throw new TypeError('Router.use() requires middleware function but got a
^ TypeError: Router.use() requires middleware function but got a Object

【热门文章】
【热门文章】