具有两个 MongoDB 集合查询的 ExpressJS 路由

ExpressJS Routing with Two MongoDB Collections Query

我目前有一个模型化的集合,它显示与我的模型中两个属性的查询匹配的所有文档。这两个属性显示在我的 url 路径中,通过从路由中获取这两个属性并显示与这些值匹配的文档来触发生成的路由。 e.x。 color: 'red', day:'monday',如果 URL 与 /red/monday 一起显示,则显示具有这些值的所有文档(图像)。我当前的路线正确执行此查询。

我现在想创建第二个集合,其中包含 'color' 和 'day' 的每个可能组合的描述。基本上当我转到 /red/monday 时,会显示图像,然后还会出现描述。

我不确定在一条路线的一个查询中加入这两个组合的最佳方式。有帮助吗?

图片模型:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var imageSchema = new Schema({
    day: { type: String, enum: ['Monday', 'Tuesday', 'Wednesday'] },
    color: { type: String, enum: ['Black', 'Blue', 'White'] },
    imageName: String,
    imageUrl: String,
    imageSource: String
});

var Images = mongoose.model('Images', imageSchema);

module.exports = Images;

描述型号:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var descriptionSchema = new Schema({
    pattern: { type: String, enum: ['Monday', 'Tuesday', 'Wednesday'] },
    color: { type: String, enum: ['Black', 'Blue', 'White'] },
    body: String,
});

var Description = mongoose.model('Description', descriptionSchema);

module.exports = Description;

当前路由:

var express = require('express');
var router  = express.Router();
var Images = require('./models/imagesModel');
var Description = require('./models/descriptionModel');

    /*==== Color Pages  ====*/

    router.get('/:color/day-selection', function(req, res){

        console.log(req.params.color);

        res.render('pages/color.hbs', {
            color: req.params.pattern
        });
    });


    /*====  Results ====*/


    router.get('/:color/:day/result', function(req, res){

        console.log(req.params.color);

        Images.find( { pattern: req.params.color, color: req.params.day }, function(err, image){
            if (err) { console.log(err); }
            console.log(image);

            res.render('pages/result.hbs', {
                color   : req.params.color,
                day : req.params.day,
                image : image
            });
        });
    });

我会尝试使 url 多一点 RESTful。

Url 获得一天的所有颜色就像

route.get(':days') => 服务 GET /mondays -> 获取周一所有颜色的列表。

route.get('/days') => 服务 GET /days -> 获取所有日期的列表

route.get(':days/:colors') => 服务 GET /mondays/reds -> 获取星期一的红色描述。

route.get(':day/:color/images') => 服务器 GET /mondays/reds/images -> 获取 /mondays/reds/images

的所有图像

route.get(':days/:colors/images/:id') => 提供 GET :days/:colors/images/:id => 在 /mondays/reds/images/mongo-db-id 上提供 GET -> 获取特定图像

一些其他更改,

  1. 将服务层代码移出路由器并将它们注入 express() 的实例中。例子,看了不要脸的外挂,-https://github.com/swarajgiri/express-bootstrap/blob/master/bootstrap/app.js#L86
  2. 将数据库连接作为参数传递给服务层。 https://github.com/swarajgiri/express-bootstrap/blob/master/core/index.js
  3. (可选)- 使用 promises 和 generators 进行流量控制。例如 - https://gist.github.com/swarajgiri/16202e32aa4d80d45c62