Проблема с методом Mongoose Model.find (), который не работает в производственной среде - PullRequest
0 голосов
/ 25 сентября 2018

У меня проблема с Model.find() методом mongoose. В среде разработки он работает правильно, но когда я развернул свое приложение на heroku и mLab, оно не работает должным образом. В моем проекте у меня есть меню поиска с выпадающим менюсписок элементов, которые поступают из базы данных, и я передаю их в шаблон руля. При нажатии на раскрывающемся списке есть элементы, из которых вы можете выбрать: ссылка

Но когда я иду в производство нене работает: http://s1356.photobucket.com/user/acho999/media/production%20-evironment_zpsb49om1nz.png.html

В моем js-файле указан код отключения. И я не знаю, в чем я не прав. Я прочитал много статей. Я отключил автоиндекс в своей модели, прочитал о драйвере mongodbя обновляю его, также совместимость MongoDb и Mongoose, они являются последними резидентами ... Я понятия не имею, что не так. Пожалуйста, помогите мне с этим.

const express = require("express");
const router = express.Router();
const Condition = require("../models/Condition");
const Manufacturer = require("../models/Manufacturer");
const Material = require("../models/Material");
const Kind = require("../models/Kind");
const Type = require("../models/Type");
const db = require("../connection/databaseConn");

router.get("/categoriesLoad",(req,res)=>{

        let types = [];
        let kinds = [];
        let materials = [];
        let conditions = [];
        let manufacturers = [];

    //db.then(()=>{
        
        Type.find({},(err,t)=>{
            t.forEach(x=>types.push(x));
        });

        Kind.find({},(err,t)=>{
            t.forEach(x=>kinds.push(x));
        });

        Material.find({},(err,t)=>{
            t.forEach(x=>materials.push(x));
        });

        Condition.find({},(err,t)=>{
            t.forEach(x=>conditions.push(x));
        });

        Manufacturer.find({},(err,t)=>{
            t.forEach(x=>manufacturers.push(x));
        }).then(()=>{
            
            let add = req.session.addMessage;
    
            req.session.addMessage ="";
            
            res.render("adminArea",{types,kinds,materials,conditions,manufacturers,add});
        });
    
    //})
});

module.exports = router;

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Основная проблема заключается в том, что вы не можете гарантировать, что Manufacturer.find завершится после завершения всех других запросов к базе данных.

Другая проблема заключается в том, что никогда не смешивайте обратные вызовы и обещания, попробуйте унифицировать стиль кодирования, а обратные вызовытак ES5, я предлагаю использовать только Promise.

Попробуйте это:

Promise.all([
  Type.find().exec(),
  Kind.find().exec(),
  Material.find().exec(),
  Condition.find().exec(),
  Manufacturer.find().exec()
]).then(([types, kinds, materials, conditions, manufacturers]) => {
  const add = req.session.addMessage;
  req.session.addMessage = '';
  res.render('adminArea', {
    types,
    kinds,
    materials,
    conditions,
    manufacturers,
    add
  });
});
0 голосов
/ 25 сентября 2018

пара вещей, на которые стоит обратить внимание:

- это ваша база данных, заполненная объектами.
- это ваш код синхронного создания.

производитель выполнит. Тогда может быть, прежде чем все остальное даже сделано.все эти .find () будут выполняться одновременно, поэтому, если manafacturer будет выполнен, он выполнит .then (), а затем вы получите пустые списки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...