Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

一个简单的Node应用的开发历程 #19

Open
Hancoson opened this issue Oct 19, 2017 · 0 comments
Open

一个简单的Node应用的开发历程 #19

Hancoson opened this issue Oct 19, 2017 · 0 comments
Labels

Comments

@Hancoson
Copy link
Owner

最近终于有时间�静下心来学学node相关的知识了,那么来做一个什么东西呢?想来想去还是来做一个简单的bolg吧~~。接下来就介绍一下具体的历程。

技术栈

  • node
  • express(web应用框架)
  • mongoose(数据库)
  • pm2(应用进程管理)
  • swagger(API功能调试)

项目介绍

本文章将用具体的项来介绍 node-app:https://github.com/Hancoson/node-app

文件结构

  • app.js:入口文件
  • package.json:工程信息及包管理
  • node_moudules:依赖模块
  • public:静态资源(css、js、images)
  • routes:路由管理
  • view:模版文件
  • models:数据模型
  • config:项目配置文件
  • app:存放�控制器、公用方法等
  • bin:项目配置脚本

MVC模式

  • Model
    • node提供的模块,中间件,在用express创建项目时,产生node_modules即表示M
    • 模块如ejsmongoosemorganbody-parser等等
  • View
    • express生成项目时会产生views,即前端
  • Controller
    • 即视图向控制器发出请求,由控制器选择相应的模型来处理
    • 模型返回的结果给控制器,由控制器来选择合适的视图,生成界面给用户
    • 如通过res.render来渲染ejs文件

路由

  • 意义 : 访问主页时调用ejs模板引擎渲染index.ejs文件
  • 实现方法 :
    • app.js中写入require('./routes/index')(app)即可引入�;
    • 路由中在引入对应的Controller来实现具体数据的展示app.get('/articles/:id', articles.getArticle);

Controller

主要来处理业务逻辑,也就是说数据该怎么展示由他来管理,具体实现如下:

function (req, res) {
  blogdbs.find({
    _id: req.params.id //查询条件
  }, function (err, data) {
    if (err) {
      //err
    } else {
      res.render('articles', {
        ... //数据对象
      });

    }
  })
}

Model

Model前先说说Schema,那么Schema是什么呢?它类似于关系数据库的表结构。具体实现如下:

var mongoose = require('mongoose');
var schema = mongoose.Schema;
var _blogSchema = new Schema({
  title: {
    type: 'String'
  },
  ...
});

接下来就可以创建Model了,格式是mongoose.model(modelName, schema);

Schema后为什么还要有Model呢?

Mongoose的设计理念中,Schema用来也只定义数据结构,具体对数据的增删改查操作都由Model来执行。

就好比富士康用模具组装出一台手机后,当需要打电话时是用手机来打而不是用模具。

遇到的问题

  • node开发过程中需要�频繁的重启项目,后来学习解了pm2来管理进程,并可监控node服务端的更新,不用再重启服务了,开发效率大大提高。

  • 在服务端异步提交数据时候,app.js中需要加入以下代码,并且需要在路由引入的上方。

    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({extended: false}));
    
  • app.get()app.use()app.all()

    • app.use(path,callback)中的callback既可以是router对象又可以是函数
    • app.get(path,callback)中的callback只能是函数,可以将 app.get() 看做 app.use() 的请求 get 方式的简要写法。
    • app.all() 附加到应用程序的路由,所以使用 app.router 中间件负责处理所有的路由请求,如:GET、POST等;
    var express = require('express');
    var app = express();
    app.get('/hello',function(req,res,next){
      res.send('hello test2');
    });
    
    //等同于:
    var express = require('express');
    var app = express();
    var router = express.Router();
    router.get('/', function(req, res, next) {
      res.send('hello world!');
    });
    app.use('/hello',router);
    
    

    如果您觉得阅读本文对您有帮助,请“Star”,您的“Star”将是我最大的写作动力!

    项目地址:node-app

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant