【问题标题】:ExpressJS Routing with Two MongoDB Collections QueryExpressJS 路由与两个 MongoDB 集合查询
【发布时间】:2015-12-15 00:37:27
【问题描述】:

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

我现在想创建第二个集合,其中包含“颜色”和“日期”的每种可能组合的描述。基本上当我去 /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
            });
        });
    });

【问题讨论】:

    标签: node.js mongodb express mongoose routes


    【解决方案1】:

    我会尝试让网址更加 RESTful。

    获取一天所有颜色的网址类似于

    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. (可选)- 使用承诺和生成器进行流量控制。前 - https://gist.github.com/swarajgiri/16202e32aa4d80d45c62

    【讨论】:

    • 感谢所有提示。您能否详细说明您提到的其他更改中的第一个?将服务层代码移出路由器?
    • Cphill - 查看链接的 github 存储库。它基本上做的是创建单独的模块来处理创建和持久化实体并将它们注入应用程序。如果您还有其他问题,请告诉我。
    猜你喜欢
    • 2016-09-27
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2020-03-24
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多