MEAN,从MONGO DB里弄出点东东来啦,以REST风格显示JSON

最近一直在弄弄的。。。

javascript的风格弄熟了,我觉得肯定很快,,但心中有种感觉,DJANGO和MEAN这种结构,搞大的不行。

因为MVC这种结构感觉不如SPRING这些严谨,是不是我有偏见呢?水平不够呢?不强制就不弄呢?

db层写法:

/**
 * Created by sahara on 2016/7/5.
 */

var mongoose = require(‘mongoose‘);
var dbURI = ‘mongodb://localhost/Loc8r‘;
var gracefulShutdown
mongoose.connect(dbURI);

mongoose.connection.on(‘connected‘, function () {
    console.log(‘Mongoose connected to ‘ + dbURI);
});
mongoose.connection.on(‘error‘,function (err) {
    console.log(‘Mongoose connection error: ‘ + err);
});
mongoose.connection.on(‘disconnected‘, function () {
    console.log(‘Mongoose disconnected‘);
});

var readLine = require ("readline");
if (process.platform === "win32"){
    var rl = readLine.createInterface ({
        input: process.stdin,
        output: process.stdout
    });
    rl.on ("SIGINT", function (){
        process.emit ("SIGINT");
    });
}

gracefulShutdown = function (msg, callback) {
    mongoose.connection.close(function () {
        console.log(‘Mongoose disconnected through ‘ + msg);
        callback();
    });
};

process.once(‘SIGUSR2‘, function () {
    gracefulShutdown(‘nodemon restart‘, function () {
        process.kill(process.pid, ‘SIGUSR2‘);
    });
});
process.on(‘SIGINT‘, function () {
    gracefulShutdown(‘app termination‘, function () {
        process.exit(0);
    });
});
process.on(‘SIGTERM‘, function() {
    gracefulShutdown(‘Heroku app shutdown‘, function () {
        process.exit(0);
    });
});

require(‘./locations‘);

数据库定义:

/**
 * Created by sahara on 2016/7/5.
 */

var mongoose = require(‘mongoose‘);

var openingTimeSchema = new mongoose.Schema({
    days: {type: String, required: true},
    opening: String,
    closing: String,
    closed: {type: Boolean, required: true}
});

var reviewSchema = new mongoose.Schema({
    author:String,
    rating: {type: Number, required: true, min: 0, max: 5},
    reviewText: String,
    createdOn: {type: Date, "default": Date.now}
});

var locationSchema = new mongoose.Schema({
    name: {type: String, required: true},
    address: String,
    rating: {type: Number, "default": 0, min: 0, max: 5},
    facilities: [String],
    coords: {type: [Number], index: ‘2dsphere‘},
    openingTimes: [openingTimeSchema],
    reviews: [reviewSchema]
});

mongoose.model(‘Location‘, locationSchema);

路由层写法:

var express = require(‘express‘);
var router = express.Router();
var ctrlLocations = require(‘../controllers/locations‘);
var ctrlReviews = require(‘../controllers/reviews‘);

//locations
router.get(‘/locations‘, ctrlLocations.locationsListByDistance);
router.post(‘/locations‘, ctrlLocations.locationsCreate);
router.get(‘/locations/:locationid‘, ctrlLocations.locationsReadOne);
router.put(‘/locations/:locationid‘, ctrlLocations.locationsUpdateOne);
router.delete(‘/locations/:locationid‘, ctrlLocations.locationsDeleteOne);

//reviews
router.post(‘/locations/:locationid/reviews‘, ctrlReviews.reviewCreate);
router.get(‘/locations/:locationid/reviews/:reviewid‘, ctrlReviews.reviewReadOne);
router.put(‘/locations/:locationid/reviews/:reviewid‘, ctrlReviews.reviewUpdateOne);
router.delete(‘/locations/:locationid/reviews/:reviewid‘, ctrlReviews.reviewDeleteOne);

module.exports = router

控制器写法:

/**
 * Created by sahara on 2016/7/6.
 */

var mongoose = require(‘mongoose‘);
var Loc = mongoose.model(‘Location‘);

var sendJsonResponse = function(res, status, content) {
    res.status(status);
    res.json(content);
};

module.exports.locationsListByDistance = function (req, res) {
    sendJsonResponse(res, 200, {"status" : "success"});
};

module.exports.locationsCreate = function (req, res) {
    sendJsonResponse(res, 201, {"status" : "success"});
};

module.exports.locationsReadOne = function (req, res) {
    if (req.params && req.params.locationid){
        Loc
            .findById(req.params.locationid)
            .exec(function(err, location){
                if (!location) {
                    sendJsonResponse(res, 404, {
                        "message": "locationid not found"
                    });
                    return;
                } else if (err) {
                    sendJsonResponse(res, 404, err);
                    return;
                }
                sendJsonResponse(res, 200, location);
            });
    } else {
        sendJsonResponse(res, 404, {
            "message": "no locationid in request"
        });
    }
};

module.exports.locationsUpdateOne = function (req, res) {
    sendJsonResponse(res, 200, {"status" : "success"});
};

module.exports.locationsDeleteOne = function (req, res) {
    sendJsonResponse(res, 204, {"status" : "success"});
};

app.js的改装:

var express = require(‘express‘);
var path = require(‘path‘);
var favicon = require(‘serve-favicon‘);
var logger = require(‘morgan‘);
var cookieParser = require(‘cookie-parser‘);
var bodyParser = require(‘body-parser‘);
require(‘./app_api/models/db‘);

var routes = require(‘./app_server/routes/index‘);
var routesApi = require(‘./app_api/routes/index‘);
var users = require(‘./app_server/routes/users‘);

var app = express();

// view engine setup
app.set(‘views‘, path.join(__dirname, ‘app_server‘, ‘views‘));
app.set(‘view engine‘, ‘jade‘);

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, ‘public‘, ‘favicon.ico‘)));
app.use(logger(‘dev‘));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, ‘public‘)));

app.use(‘/‘, routes);
app.use(‘/api‘, routesApi);
app.use(‘/users‘, users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error(‘Not Found‘);
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get(‘env‘) === ‘development‘) {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render(‘error‘, {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render(‘error‘, {
    message: err.message,
    error: {}
  });
});

module.exports = app;

时间: 2025-01-07 06:55:12

MEAN,从MONGO DB里弄出点东东来啦,以REST风格显示JSON的相关文章

JDK8的随笔(01)_Lambda表达式是个神马东东,初尝禁果

Lambda表达式 先写写背景和最基本的东东,泛型加入和各种循环的复杂模式后面再慢慢深入. 需要看JDK8的背景 虽然网上的介绍很多,但是不如自己读一下document后来得正宗. 说一下缘由,突发的这个项目客户貌似是个暴发户,发疯什么都要用最新的,JDK8是否稳定也不管,各种要求最新.Lambda语法全上,各种jdk8最新的东西全往上搞,我靠...WS还有其他的容器是否对8的支持很好也不知道....不过,这也不是坏事,学呗~~~~ 等jdk出到12的时候再回头看看也挺有意思. 本文也是以JDK

Mongo DB 2.6 需要知道的一些自身限定

在现实的世界中,任何事情都有两面性,在程序的世界中,亦然! 我们不论是在使用一门新的语言,还是一门新的技术,在了解它有多么的让人兴奋,让人轻松,都么的优秀至于,还是很有必要了解一些他的局限性,方便你在实际开发过程中 遇到这些的时候 明白应该怎么处理,在涉及到这些地方的时候,能预先的判断,文章翻译自Mongo DB 官网,翻译的不好,还望大家谅解,同时本人也在使用Mongo DB 对空间地理编码进行一些操作, 希望大家多多交流 多多指教,在此先行谢过!!! 该笔记提供了一些关于使用Mongo DB

C语言判别输入的东东

梗概:现在很多用C语言写出来的作业,都是用户输入后,电脑对应操作的.其实这样有没有漏洞呢? 这样的管理系统,相信大家也不陌生,我们这里不是谈它的功能和怎样实现..我们就谈谈最后一行.[输入序号].其实很简单,switch语句,0-6中用case包括就OK了..最后来个default,一切不就好了吗? 是的,很多人会对着软件提示按..但我假设一下:电脑键盘上那么多按钮,一不小心按了字母怎么办?哈哈..很多人会说:那就default语句执行咯.但事实上是不是呢? 我亲自试了试,吓尿了.你猜怎样?整个

C语言判别输入东东

梗概:现在很多用C语言写出来的作业,都是用户输入后,电脑对应操作的.其实这样有没有漏洞呢? 这样的管理系统,相信大家也不陌生,我们这里不是谈它的功能和怎样实现..我们就谈谈最后一行.[输入序号].其实很简单,switch语句,0-6中用case包括就OK了..最后来个default,一切不就好了吗? 是的,很多人会对着软件提示按..但我假设一下:电脑键盘上那么多按钮,一不小心按了字母怎么办?哈哈..很多人会说:那就default语句执行咯.但事实上是不是呢? 我亲自试了试,吓尿了.你猜怎样?整个

【UVA 1151】 Buy or Build (有某些特别的东东的最小生成树)

[题意] 平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方. 另外还有q(0<=q<=8)个套餐,可以购买,如果你购买了第i个套餐,该套餐中的所有结点将变得相互连通,第i个套餐的花费为ci. 求最小花费. Input (1 ≤ n ≤ 1000)  (0 ≤ q ≤ 8). The second integer is the the cost of the subnetwork(not greater

SQLSERVER 里经常看到的CACHE STORES是神马东东?

SQLSERVER 里经常看到的CACHE STORES是神马东东? 当我们在SSMS里执行下面的SQL语句清空SQLSERVER的缓存的时候,我们会在SQL ERRORLOG里看到一些信息 DBCC FREEPROCCACHE 大家可以看到cachestore.object plans.sql plan.bound tress等名词 cachestore flush for the 'Object Plans' cachestore (part of plan cache) cachestor

(转)loff_t *ppos是什么东东

ssize_t generic_file_read(struct file * filp, char * buf, size_t count, loff_t *ppos) 这是一个文件读函数 我们很容易看出输入参数中 filp 是文件 buf 是文件要读到什么地方去,用户buf count是要读多少东西 那么ppos是什么东东,是当前文件的偏移量嘛?? 但是当前文件的偏移量在filp中有定义呀.struct file { struct list_head f_list; struct dentr

Mongo DB Developer 认证 -- 大纲&目录

报名了5月10日的认证考试,打算准备之余把学习的笔记记录下来,所以计划就搞个Mongo系列作为博客首秀吧. 下面的思维导图是根据Mongo DB Developer 认证的考试大纲所绘制,主要是为了在学习中将各个主题细分,然后逐一去了解各个模块.Mongo DB 认证官网:https://university.mongodb.com/exam/DEVELOPER/about Mongo DB中的概念和思想(待更新): Mongo DB 的shell 和CRUD 操作(待更新): Mongo DB

一个考试模拟界面——先记录一下下ui上的东东

先上图,有图有真相 要记录的有以下几点: (1)如何给控件widget加背景图片 (2)如何改变控件中的字体大小,如何让界面中字体都改变 (3)如何构造除了这么漂亮的布局呀,这一点上还是很骄傲的!嘿嘿... (4)在python2.7编写出的界面上显示中文 Part1: 还是先写如何布局吧..按照时间顺序来.. 在pyside中,关于layout,已经接触的有:QtGui.QVBoxLayout(竖直向下的),QtGui.QHBoxLayout(横向的),这两天接触到了一个QtGui.QGrid