node.js + express + mongo的编写模式疑问

最近在学习node.js, 顺便想使用node.js+express+mongo弄一个系统, 用来学习前端的知识. 在选用数据库时候使用mongo. 于是我编写了一下如下代码:

/*
 * 学生管理功能模块
 * 文档参考: doc/dbtables/student.md
 * 支持的操作为: 新增, 编辑, 修改, 批量删除
 */
var express = require('express');
var router = express.Router();
var init = function(callback) {
    var MongoClient = require('mongodb').MongoClient;
    var url = 'mongodb://localhost:27017/test_system';
    MongoClient.connect(url, function (err, db) {
        assert.equal(null, err);
        console.log("Connected successfully to server");
        var collection = db.collection('students');
        callback(collection);
    });
};
var cal = function(collection) {
    router.get('/', function(req, res, next) {
        collection.find({}).toArray(function(err, students) {
            if (!err) {
                console.log(students);
                res.render('students', {students: students});
            }
        });
    });
};

init(cal);
  1. 不太熟悉node.js + express的开发模式, 我这里使用数据库查询时候, 必须先连接成功数据库, 然后使用回调调用正常的POST/GET的方法. 这样很不是灵活.

  2. 有没有更好的解决方法, 例如数据库的访问不是异步式的.

问题:

  1. node.js + express + mongo中, 在实际项目中使用它们的人, 能否大概讲述下如何进行模块的编写?

阅读 3.3k
2 个回答

有一个不错的解决方案是数据库操作的功能用后端Java或者PHP等写成REST接口,例如https://api.myapp.com/v1.0/class/student_id,然后在Node直接调用这个接口。

首先明确你的使用用途

  1. 服务端渲染模板为主 传统的MVC模式
  2. 前后端分离 作为单纯做验证和数据读写 接收发送json的rest接口

MVC规划目录结构

参考express官方创建工具的模式,views文件夹存放模板文件,routes文件夹负责路由分发

  1. 假设你有users,orders两个模块那么,你应该用两个Router实例分别处理users和orders的请求,如在routes文件夹创建users文件夹和orders文件夹,分别处理各自的action。这一步相当于传统MVC中C层。
  2. 相对应的 views文件夹也要按照你的不同需求 创建不同的模板 比如顶级目录要有共用的头部模板 脚部模板 布局模板 创建users,orders文件夹,存放路由相对应的模板文件。
  3. 自己创建Models文件夹,用来初始化数据库配置,以及不同表的映射,比如你的users模块,必然有对应的users表,那么就相对应创建users文件夹,用来处理相关数据操作的方法,比如register.js用来处理注册的sql或者nosql操作。这一步建议新手不要过早使用ORM映射,如果项目不复杂,尽量写些原生的SQL或者NOSQL操作,锻炼数据库操作能力。
  4. 创建public文件夹,存放静态文件,使用express静态文件中间件。
  5. 操作流程应该是,路由拦截请求,根据路径的不同,send过去不同的模板,然后根据cookie、session、或者请求的参数,来判断model执行哪些读写操作,或者不执行。得到数据后,动态将数据传入模板,在模板内使用一些条件,循环语句,来渲染页面。(推荐pug)

RESTFUL

  1. 和MVC模式一样,应当有routes目录拦截所有请求,不过需要更细粒化的来将Router实例的Route分别挂载不同的请求handler,比如post,get,delete,put等;
  2. model层依旧按表映射目录,不过方法变更为处理对不同的请求,如post到/users是注册,get到则是获取信息,delete是删除用户,put是更新用户等。
  3. route拦截请求,到model层做不同的数据操作,然后返回一个json格式的数据,此时前端拿到数据,使用vue,react等框架渲染前端页面。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题