遇到的坑已填,重构《Node.js 实战》的博客例子。

遇到的坑已填,重构《Node.js 实战》的博客例子。

概述

  • 例子来自 《node.js 实战》这本书的第一章。
  • 用 coffeeScript & express4 & bootstrap 重构。
  • 在这编码过程以及部署过程中遇到很多坑,希望这个例子能够帮到同样遇坑的朋友。

功能

  1. 多人注册、登录
  2. 发布文章 (markdown语法)
  3. 发布评论 (markdown语法)
  4. 上传文件
  5. 用户文章页
  6. 文章的编辑删除
  7. 存档浏览
  8. 标签浏览
  9. 分页功能
  10. 文章pv (浏览数)
  11. 文章搜索
  12. 系统日志记录

演示

点我立即看demo


技术: node.js+express4+mongodb
时间: 2014年6月
源码: blog-coffeeScript-express4-bootstrap3
我的博客: think2011

8 回复

遇到的坑已填,重构《Node.js 实战》的博客例子

概述

本文介绍了如何使用 coffeeScriptexpress4bootstrap 重构《Node.js 实战》一书中第一章的例子。在这个过程中,遇到了一些坑,并且已经逐一解决。希望通过这个例子帮助遇到类似问题的朋友。

功能

重构后的博客系统具备以下功能:

  1. 多人注册、登录
  2. 发布文章 (Markdown 语法)
  3. 发布评论 (Markdown 语法)
  4. 上传文件
  5. 用户文章页
  6. 文章的编辑删除
  7. 存档浏览
  8. 标签浏览
  9. 分页功能
  10. 文章PV (浏览数)
  11. 文章搜索
  12. 系统日志记录

示例代码

这里提供一个简单的示例代码片段,展示如何使用 express4 创建一个基本的路由来处理用户登录:

// app.coffee
express = require('express')
bodyParser = require('body-parser')

app = express()

# 使用 bodyParser 解析请求体
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

# 登录路由
app.post '/login', (req, res) ->
    username = req.body.username
    password = req.body.password

    # 这里假设有一个用户验证函数
    isValidUser = validateUser(username, password)

    if isValidUser
        req.session.user = {username}
        res.status(200).json({success: true, message: '登录成功'})
    else
        res.status(401).json({success: false, message: '用户名或密码错误'})

# 启动服务器
app.listen 3000, () ->
    console.log 'Server is running on port 3000'

技术栈

  • Node.js: 后端运行环境
  • Express4: Web 框架
  • MongoDB: 数据库
  • CoffeeScript: 一种更简洁的 JavaScript 编程语言
  • Bootstrap: 前端框架

时间

2014年6月

源码

GitHub 仓库

我的博客

Think2011


通过上述示例代码,可以看到如何使用 express4 创建一个简单的登录路由。实际项目中还需要更多的功能实现和优化,例如用户会话管理、数据库操作等。希望这个例子能帮助大家更好地理解和实现类似的项目。


node.js本身每个文件就是一个模块,使用coffeeScript生成的感觉反而不是很清爽

使用coffeescript的目的是因为觉得写起代码来非常爽,当然同时本来1个文件的,一下子变成3个文件了。

最近也在折腾个博客,这个看起来不错,文章链接最好,用_id什么的,要不太长了。

本站用的是_id吗? 似乎只有mongoose才能产生这样的ID是吗? 因为是书中的例子,并没有做优化改写。

是的啊。不是mongoose也可以啊,我在折腾中的 https://github.com/nosqldb/nblog ,目前界面比较丑,在想借鉴你的还是直接在你的基础上改。

就我觉得,这个源码只能借鉴,本身偏练习多一些,自己从零设计一个博客的话,得重新考虑架构。 界面如何设计关系不大,只要后端结构足够清晰,即使推翻设,重新计都没有关系。 重要的是后端的结构,我在重构这个源码的时候,发现当要更换模块,或者变动代码的时候,特别困难,因为没有考虑过复用性,这是一个针对练习的例子,或许你找找本站的源码参考。

概述

重构《Node.js 实战》的博客例子。这个例子使用了CoffeeScript、Express4和Bootstrap进行重构,并且涵盖了以下功能:

  • 多人注册、登录
  • 发布文章(Markdown语法)
  • 发布评论(Markdown语法)
  • 上传文件
  • 用户文章页
  • 文章的编辑删除
  • 存档浏览
  • 标签浏览
  • 分页功能
  • 文章PV(浏览数)
  • 文章搜索
  • 系统日志记录

示例代码

以下是几个核心功能的示例代码:

注册与登录

# routes/auth.coffee
auth = require '../controllers/auth'

module.exports = (app) ->
  app.post '/signup', auth.signup
  app.post '/login', auth.login
# controllers/auth.coffee
bcrypt = require 'bcrypt'
User = require '../models/user'

exports.signup = (req, res) ->
  user = new User()
  user.email = req.body.email
  user.password = bcrypt.hashSync(req.body.password, 10)
  user.save (err) ->
    if err then res.status(500).send(err) else res.send('Signup Success')

exports.login = (req, res) ->
  email = req.body.email
  password = req.body.password
  User.findOne {email: email}, (err, user) ->
    if err or not user? or not bcrypt.compareSync(password, user.password)
      res.status(401).send("Invalid Email/Password")
    else
      res.send('Login Success')

发布文章

# routes/article.coffee
articleCtrl = require '../controllers/article'

module.exports = (app) ->
  app.post '/article', articleCtrl.createArticle
# controllers/article.coffee
Article = require '../models/article'
marked = require 'marked'

exports.createArticle = (req, res) ->
  article = new Article()
  article.title = req.body.title
  article.content = marked(req.body.content)
  article.save (err) ->
    if err then res.status(500).send(err) else res.send('Article Created')

文章列表与分页

# routes/article.coffee
articleCtrl = require '../controllers/article'

module.exports = (app) ->
  app.get '/articles', articleCtrl.getArticles
# controllers/article.coffee
Article = require '../models/article'
mongoosePaginate = require 'mongoose-paginate'

Article.plugin mongoosePaginate

exports.getArticles = (req, res) ->
  options =
    page: req.query.page or 1
    limit: 10
  Article.paginate {}, options, (err, result) ->
    if err then res.status(500).send(err) else res.send(result)

技术栈

  • Node.js: 后端运行时环境
  • Express4: Web应用框架
  • MongoDB: 数据库
  • CoffeeScript: 代码更简洁
  • Bootstrap3: 前端UI库

源码

你可以从这里获取完整的源码。

我的博客

更多技术分享可以在我的博客:Think2011 查看。

回到顶部