Пн goose не может найти нужный вывод - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть три схемы.

Пользователь. js:

const mongoose = require("mongoose");
const bcrypt = require("bcryptjs");
const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    unique: true,
    required: true,
  },
  password: {
    type: String,
    required: true,
  },
});

userSchema.pre("save", function (next) {
  const user = this;
  if (!user.isModified("password")) {
    return next();
  }

  bcrypt.genSalt(10, (err, salt) => {
    if (err) {
      return next(err);
    }
    bcrypt.hash(user.password, salt, (err, hash) => {
      if (err) {
        return next(err);
      }
      user.password = hash;
      next();
    });
  });
});

userSchema.methods.comparePassword = function (candidatePassword) {
  const user = this;
  return new Promise((resolve, reject) => {
    bcrypt.compare(candidatePassword, user.password, (err, isMatch) => {
      if (err) {
        return reject(err);
      }

      if (!isMatch) {
        return reject(false);
      }

      resolve(true);
    });
  });
};

mongoose.model("User", userSchema);

Проект. js:

const mongoose = require("mongoose");

const diamondSchema = new mongoose.Schema({
  criteria: {
    novelty: String,
    technology: String,
    complexity: String,
    pace: String,
  },
});

const projectSchema = new mongoose.Schema({
  userId: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User",
  },
  projectName: {
    type: String,
    default: "",
  },
  projectBudget: {
    type: Number,
  },
  projectDuration: {
    type: Number,
  },
  industry: {
    type: String,
  },
  companyName: {
    type: String,
  },
  numberOfEmployees: {
    type: Number,
  },
  diamond: [diamondSchema],
});

mongoose.model("Project", projectSchema);

Рекомендация. js:

const mongoose = require("mongoose");

const diamondSchema = new mongoose.Schema({
  criteria: {
    novelty: String,
    technology: String,
    complexity: String,
    pace: String,
  },
});

const recommendationSchema = new mongoose.Schema({
  diamond: [diamondSchema],
  description: {
    type: String,
  },
});

mongoose.model("Recommendation", recommendationSchema);

и два файла маршрута.

authRoutes. js:

const express = require("express");
const mongoose = require("mongoose");
const User = mongoose.model("User");
const jwt = require("jsonwebtoken");

const router = express.Router();

router.post("/signup", async (req, res) => {
  const { name, email, password } = req.body;

  try {
    const user = new User({ name, email, password });

    await user.save();

    const token =
      //token has payload-->user id
      jwt.sign({ userId: user._id }, "MY_SECRET_KEY");

    res.send({ token });
  } catch (err) {
    //invalid data
    return res.status(422).send(err.message);
  }
});

router.post("/signin", async (req, res) => {
  const { email, password } = req.body;

  if (!email || !password) {
    return res.status(422).send({ error: "Must provide email and password" });
  }
  const user = await User.findOne({ email });
  if (!user) {
    return res.status(404).send({ error: "Invalid email or password" });
  }

  try {
    await user.comparePassword(password);
    const token = jwt.sign({ userId: user._id }, "MY_SECRET_KEY");
    res.send({ token });
  } catch (err) {
    return res.status(422).send({ error: "Invalid email or password" });
  }
});

module.exports = router;

projectRoutes. js:

const express = require("express");

const mongoose = require("mongoose");

const requireAuth = require("../middlewares/requireAuth");

const Project = mongoose.model("Project");
const Recommendation = mongoose.model("Recommendation");
const router = express.Router();

router.use(requireAuth);

router.get("/projects", async (req, res) => {
  const projects = await Project.find({ userId: req.user._id });
  res.send(projects);
});

router.post("/projects", async (req, res) => {
  const {
    projectName,
    projectBudget,
    projectDuration,
    industry,
    companyName,
    numberOfEmployees,
    diamond,
  } = req.body;

  if (
    !projectName ||
    !projectBudget ||
    !projectDuration ||
    !industry ||
    !companyName ||
    !numberOfEmployees ||
    !diamond
  ) {
    return res.status(422).send({ error: "Must provide all project details" });
  }

  try {
    const project = new Project({
      projectName,
      projectBudget,
      projectDuration,
      industry,
      companyName,
      numberOfEmployees,
      diamond,
      userId: req.user._id,
    });

    await project.save();

    //res.send(project);
  } catch (err) {
    res.status(422).send({ error: err.message });
  }
  try {
    const rec = await Recommendation.find({ diamond });
    //console.log(diamond);
    console.log(description);
    res.send(rec);
  } catch (err1) {
    res.status(422).send({ error: err1.message });
  }
});

module.exports = router;

Используя почтальона, в файле projectRoutes. js, когда я пытаюсь отправить почтовый запрос на localhost:3000/projects, я пытаюсь создать новый проект, и в ответ я хочу description. Моя логика c заключается в том, что после сохранения нового проекта в коллекции projects я пытаюсь найти документ с ОДНЫМ ОБЪЕКТОМ АЛМАЗНОГО ОБЪЕКТА criteria в коллекции recommendations, который также присутствует в коллекции projects. Это значит, что у меня есть предопределенные записи в коллекции recommendations и коллекции projects ::

recommendations collection

projects collection

Поэтому мне нужен какой-то способ, чтобы при попытке добавить новый проект для пользователя объект criteria в массиве diamond, который я установил, соответствует объекту критерия в массиве diamond в определил один из recommendations документов и в почтовом запросе localhost:3000/projects я могу вернуть description в ответ. Как я делаю console.log(description) в projectRoutes.js, он отображается как неопределенный. Я не знаю почему. Надеюсь, это имеет смысл.

По сути, идея заключается в том, что число рекомендаций с уникальными критериями будет ограничено. Таким образом, всякий раз, когда новый проект создается на основе критериев, пользователю отображается рекомендация.

1 Ответ

1 голос
/ 27 апреля 2020

Если у вас есть только один элемент массива в проекте и рекомендация

const {
  projectName,
  projectBudget,
  projectDuration,
  industry,
  companyName,
  numberOfEmployees,
  diamond,
} = req.body;

const [projectDiamond] = diamond // get the first object in the diamond array
const { criteria } = projectDiamond // extract criteria

const recommendation = await Recommendation.find({ 'diamond.criteria': criteria });

Обратите внимание, что порядок полей критериев должен совпадать, так как мы ищем соответствующий объект в массиве.

Ссылка: https://docs.mongodb.com/manual/tutorial/query-arrays/#query -an-array

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