本文共 3252 字,大约阅读时间需要 10 分钟。
使用Express框架搭建论坛的首选工具是应用生成器。通过以下命令创建一个完整的开发框架:
npm install -g express-generatorexpress node_express_forum
生成后进入目录,安装必要依赖:
cd node_express_forumnpm install --save-dev
启动服务器并进入开发环境:
npm start
访问 127.0.0.1:3000 查看默认页面。
完成框架搭建后,进行以下准备工作:
替换默认的Jade模板引擎,选择EJS:
npm install ejs --save-dev
在 app.js 中设置:
app.set('view engine', 'ejs'); 创建用户、主题和回复三张表,定义模型文件:
// models/user.jsmodule.exports = { hash: function(str) { return crypto.createHmac('sha1', str).update('love').digest('hex'); }, reg: function(username, password, regtime, cb) { pool.getConnection(function(err, connection) { if (err) throw err; connection.query('SELECT `id` FROM `user` WHERE `username` = ?', [username], function(err, result) { if (err) throw err; if (result.length) { cb({ isExisted: true }); } else { connection.query('INSERT INTO `user` SET ?', { username, password, regtime }, function(err, result) { cb(result); }); } }); }); }, login: function(username, password, cb) { pool.getConnection(function(err, connection) { if (err) throw err; connection.query('SELECT `id` FROM `user` WHERE `username` = ? AND `password` = ?', [username, password], cb); }); }}; 安装MySQL模块并创建数据库连接池:
npm install mysql --save-dev
创建 db.js 文件:
var mysql = require('mysql');var pool = mysql.createPool({ host: '127.0.0.1', user: 'root', password: '123', database: 'forum'});module.exports = pool; 在 routes/user.js 中定义登录路由:
router.post('/login', function(req, res, next) { var username = req.body.username || ''; var password = req.body.password || ''; var password_hash = user_m.hash(password); user_m.login(username, password_hash, function(result) { if (result.length) { req.session.user = { uid: result[0].id, username }; res.redirect('/'); } else { res.render('login', { errmsg: '用户名或密码错误' }); } });}); 创建 list.js 模型:
module.exports = { getIndexList: function(cb) { pool.getConnection(function(err, connection) { connection.query('SELECT `list`.*, username FROM `list`, `user` WHERE `list`.`uid` = `user`.`id`', function(err, result) { cb(result); }); }); }}; 在 routes/list.js 中添加路由:
router.get('/addtopic', function(req, res) { if (req.session.user) { var title = req.query.title, content = req.query.content; list_m.addTopic({ uid: req.session.user.uid, title, content, createtime: Date.now() / 1000 }, function(result) { if (result.affectedRows) { res.json({ code: 0, msg: '添加成功', data: { url: '/list/' + result.insertId + '.html', title, author: req.session.user.username, createtime: result.insertId } }); } else { res.json({ code: 2, msg: '添加失败,请重新尝试' }); } }); } else { res.json({ code: 1, msg: '您还未登录' }); }}); 在 routes/list.js 中定义路由:
router.get('/:pid.html', function(req, res) { var pid = req.params.pid; async.parallel([ function(cb) { list_m.getListById(pid, cb); }, function(cb) { list_m.getReplyById(pid, cb); } ], function(err, results) { res.render('list', { data: results }); });}); 通过以上步骤,我们成功搭建了一个基于Express的简易论坛系统,涵盖了注册、登录、发布主题和回复主题等核心功能。完整的代码和文档可在我的GitHub上获取:[链接]
转载地址:http://vqvbz.baihongyu.com/