Nodejs项目初期架构如何搭建

Nodejs项目初期架构如何搭建

一个北美项目,大概的技术末节介绍:

  • 前台用 jQuery + bootstrap 2.3.2 + Angularjs 1.0.8 实现单页应用
  • 后台用 Nodejs + express
  • dev/production/test 环境包括静态资源拼合压缩编译用 grunt 集成,跑测试用的 mochaTest
  • 数据库用 mongodb
  • 模板引擎用 jade
  • 邮件发送用 nodemailer (gmail 转发,套邮件模板用了 underscore 的 templet,改写成 mustache 的语法配置)
  • 服务器是 Linode
  • 管理服务用 Kirua (比 forever 更小巧,但是对于多个应用中, Nginx 的 proxy 没跑通,没去细研)
  • 发布用 mina (current 的软连接指向到新版本不生效,索性每次发布用 mina task 生成一个 nginx.conf 文件替换掉线上,再 restart)
  • 静态资源的代理, Gzip 用 nginx
  • 图片存储本来用 blueimp 及 middleware 自己实现本机存储,后来发现 mina 发布需要 clone 的分支要管理这个图片目录共享的问题,后来索性改成了 cloudinary 云存储
  • 客服对话模块就没再用 websocket 来造轮子,直接用了 cloark
  • 评论模块亦如此,直接用了成熟的 Disqus
  • 支付用 paypal, 走的 classicApi,源于 restfulApi 未对大陆开放
  • 代码托管在 github 私有仓库

开发机是 Mac,不解释。

希望找人和我一起 Remote 办公,我 base 杭州 - ( scott at moveha.com )


5 回复

Node.js 项目初期架构如何搭建

在构建一个 Node.js 项目时,初期的架构设计非常关键。以下是一个基于上述技术栈的初期架构搭建指南,并附带一些示例代码。

1. 初始化项目

首先,我们需要初始化一个新的 Node.js 项目,并安装所需的依赖包。

mkdir my-node-app
cd my-node-app
npm init -y
npm install express jade nodemailer mongoose grunt-cli mocha --save

2. 项目结构

一个良好的项目结构能够帮助我们更好地组织代码。以下是推荐的项目结构:

my-node-app/
├── config/
│   └── db.js
├── controllers/
│   └── userController.js
├── models/
│   └── userModel.js
├── routes/
│   └── userRoutes.js
├── views/
│   └── index.jade
├── public/
│   ├── css/
│   └── js/
├── tests/
│   └── userTests.js
├── Gruntfile.js
└── server.js

3. 配置文件

config/db.js 中配置 MongoDB 数据库连接:

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/myapp', { useNewUrlParser: true, useUnifiedTopology: true });
module.exports = mongoose;

4. 启动服务器

server.js 中配置 Express 应用:

const express = require('express');
const path = require('path');
const app = express();
const mongoose = require('./config/db');

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(express.static(path.join(__dirname, 'public')));

// 引入路由
require('./routes/userRoutes')(app);

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

5. 路由和控制器

routes/userRoutes.js 中定义路由:

const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');

router.get('/', userController.getUser);
router.post('/register', userController.registerUser);

module.exports = router;

controllers/userController.js 中编写逻辑:

const User = require('../models/userModel');

exports.getUser = async (req, res) => {
    const users = await User.find();
    res.render('index', { users });
};

exports.registerUser = async (req, res) => {
    try {
        const newUser = new User(req.body);
        await newUser.save();
        res.status(201).send({ message: 'User registered successfully' });
    } catch (error) {
        res.status(500).send(error);
    }
};

6. 测试

使用 Mocha 进行单元测试,在 tests/userTests.js 中编写测试用例:

const assert = require('assert');
const request = require('supertest');
const app = require('../server');

describe('User API', function() {
    it('should register a new user', async function() {
        const response = await request(app)
            .post('/register')
            .send({
                name: 'John Doe',
                email: 'john@example.com'
            });
        assert.strictEqual(response.status, 201);
    });
});

7. 静态资源管理和发布

使用 Grunt 进行静态资源管理和自动化任务。在 Gruntfile.js 中配置 Grunt 任务:

module.exports = function(grunt) {
    grunt.initConfig({
        uglify: {
            options: {
                mangle: false
            },
            my_target: {
                files: {
                    'public/js/app.min.js': ['public/js/*.js']
                }
            }
        },
        cssmin: {
            target: {
                files: {
                    'public/css/app.min.css': ['public/css/*.css']
                }
            }
        }
    });

    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-cssmin');
    grunt.registerTask('default', ['uglify', 'cssmin']);
};

通过以上步骤,你可以搭建一个基本的 Node.js 项目架构。每个部分都有详细的配置和代码示例,可以根据具体需求进行调整。


板凳,啥方向的?

地板

对于我来说,有点难度,不过还要顶一个

对于一个基于Node.js的项目,初期架构设计是非常重要的一步。下面我会列举一些关键组件和它们的作用,并提供相应的示例代码来帮助理解。

目录结构

首先,定义项目的目录结构,这有助于保持代码的整洁性和可维护性。例如:

/project-root
    /config            // 存放配置文件
    /controllers       // 控制器层
    /models            // 数据模型
    /routes            // 路由定义
    /services          // 业务逻辑层
    /views             // 视图(如果使用模板引擎)
    /public            // 静态资源
    /tests             // 测试文件
    app.js             // 应用入口文件
    package.json       // 项目依赖声明

初始化项目

创建package.json文件并安装必要的依赖包。可以通过运行npm init命令来初始化,并使用以下命令安装常用的库:

npm install express mongoose jade nodemailer grunt-cli mocha --save

Express设置

接下来,我们将创建一个简单的Express应用作为项目的入口点 (app.js)。

const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');

// 连接MongoDB数据库
mongoose.connect('mongodb://localhost/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });

// 创建Express应用
const app = express();

// 使用body-parser中间件
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

// 设置视图引擎为Jade
app.set('view engine', 'jade');

// 定义路由
app.get('/', (req, res) => {
  res.send('Hello World!');
});

// 启动服务器
app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Grunt配置

创建Gruntfile.js以集成前端任务,如压缩、合并等。一个基本的配置可能如下所示:

module.exports = function(grunt) {

  // 项目配置。
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    uglify: {
      options: {
        banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
      },
      build: {
        src: 'src/<%= pkg.name %>.js',
        dest: 'build/<%= pkg.name %>.min.js'
      }
    }
  });

  // 加载包含 "uglify" 任务的插件。
  grunt.loadNpmTasks('grunt-contrib-uglify');

  // 默认任务。
  grunt.registerTask('default', ['uglify']);
};

环境变量

确保在不同的环境中使用不同的配置,可以利用环境变量或者.env文件来区分开发、测试和生产环境。

通过这些步骤,您可以开始构建一个基本的Node.js项目结构。随着项目的增长,您将需要扩展此基础,添加更多的功能和服务。

回到顶部