Доступ к результату запроса контроллера в express - PullRequest
2 голосов
/ 13 апреля 2020

Добрый день, сэр, новичок здесь в реакции, express mvc архитектура ...

Я знаю, что это сообщество реакции. js, но я попрошу о стороне сервера. .

Я основал приложение на учебном пособии по созданию express - mysql -реактивного приложения

В части учебного пособия обсуждалось создание архитектуры mvc, которая создает модель которая представляет собой таблицу базы данных, контроллер для соединения с запросом, а затем использует результат как API. Я выполнил базовую c цель учебника, и я хочу ее расширить.

Моя цель - чтобы получить результат функции findAll () в легенде .controller. js в мою функцию findAll () в enrollmentcount.controller. js, потому что я хочу использовать результат запроса контроллера легенды для запроса из findAll () контроллера enrollmentcount.

до сих пор это были собранные коды

это код для enrollmentcount.controller. js

const db= require('../models');
const legend = require('./legend.controller.js')
const enrollmentcount = db.enrollmentcount;
const Op = db.Sequelize.Op;

// Retrieve all enrollmentcount from the database.
exports.findAll = (req,res) =>{
    const coursecode = req.query.title;
       //get the query result values from the legend controller...
    const currsemyear = legend.getCurrentYearSem().then(function(result){console.log(result.semester);});
    console.log(currsemyear);
    var condition = coursecode ?{ title: {[Op.like]:`%${coursecode}%`}} : null;



    enrollmentcount.findAll({ where: condition})
    .then(data=>{
        res.send(data);
    })
    .catch(err =>{
        res.status(500).send({
            message:err.message || "Some error occured while retrieving enrollmentcount. "
        });
    });

};

// Find a single enrollmentcount with an id
exports.findOne= (req,res) =>{

    const id = req.params.id;

    enrollmentcount.findByPk(id)
    .then(data => {res.send(data);
    })
    .catch(
        err=>{
            res.status(500).send({
                message: "Error retrieving enrollmentcount with id=" + id
            });
    });
};

legend .контроллер. js

const db= require('../models');
const legend = db.legend;
const Op = db.Sequelize.Op;

function getCurrentYearSem(){
  return  legend.findAll({
        attributes: ['semester', 'schoolyear']
        });
}



exports.findAll = (req,res) =>{

    legend.findAll(
        {
        attributes: ['semester', 'schoolyear']
        })
    .then(data=>{

        res.send(data);
    })
    .catch(err =>{

        res.send({ message:err.message || "Some error occured while retrieving current semester and current schoolyear. "});
    });

};

enrollmentcount.controller. js

module.exports = app =>{

    const enrolledcount = require("../controllers/enrollmentcount.controller.js");

    var router = require("express").Router();

    router.get("/",enrolledcount.findAll);
    router.get("/:coursecode",enrolledcount.findOne);


    app.use("/api/enrollmentcount",router);

};

legend.routes. js

module.exports = app =>{

    const legend = require("../controllers/legend.controller.js");

    var router = require("express").Router();

    router.get("/",legend.findAll);



    app.use("/api/legend",router);

};

Я новичок в этой технологии, поэтому извините и спасибо Вы заранее

1 Ответ

0 голосов
/ 13 апреля 2020

Несколько предложений, которые, я надеюсь, помогут.

  • Я предлагаю добавить еще один слой между вашими контроллерами и вашей базой данных. Общий шаблон, который мне нравится использовать, это controller => service => repository. Контроллер получает запрос, извлекает / проверяет данные, необходимые службе, вызывает службу и возвращает результаты. Служба может выполнять бизнес-логику c, например, объединять воедино данные из нескольких вызовов БД, обрабатывать данные и т. Д. c Хранилище отвечает только за взаимодействие с базой данных. Например, создание записей или их загрузка.

  • Если вы переместите код, который загружает данные из базы данных, за пределы контроллера, как я описал выше, два контроллера могут использовать уровень обслуживания чтобы получить данные без необходимости связывать контроллеры вместе.

  • Вам нужно экспортировать функцию getCurrentYearSem, если вы собираетесь использовать ее в другом модуле.

  • cursemyear - это обещание, которое разрешит к значению, возвращенному функцией getCurrentYearSem. Код, которому нужен доступ к значению, должен быть в методе then, или вы можете использовать async / await, чтобы приостановить выполнение функции, пока значение не будет разрешено. В вашем случае добавьте asyn c перед сигнатурой функции findall в enrollmentcount.controller. js, а затем измените 'const currsemyear = legend.getCurrentYearSem (). Then (функция (результат) {console.log (result.semester) ;});» to 'const currsemyear = await legend.getCurrentYearSem (); Google 'mdn asyn c await' и посмотрите документы mozilla на async / await для получения более подробной информации.

  • Вы фактически не используете значение cursemyear нигде, кроме оператора log

Вот сокращенный пример, чтобы показать вам, что я имею в виду ( не тестировался, поэтому вам придется немного его почистить):

enrollmentcount.controller. js

// Retrieve all enrollmentcount from the database.
exports.findAll = async (req,res) => {
    const coursecode = req.query.title;
    const enrollmentCount = await schoolService.getEnrollmentCount(courseCode);
    res.send(data);
}

school.service. js

const legendRepo = require('../repositories/legend.repository');
const enrollmentRepo = require('../repositories/enrollment.repository');

exports.getEnrollmentCount = async (courseCode) {
  const currentYearSem = await legendRepo.getCurrentYearSem();
  console.log(currentYearSem);

  const condition = coursecode ? { title: {[Op.like]:`%${coursecode}%`}} : null;

  return enrollmentRepo.getEnrollmentCount(condition);
}

legend.repository. js

const db= require('../models');
const legend = db.legend;

exports.getCurrentYearSem = () => {
  return  legend.findAll({
    attributes: ['semester', 'schoolyear']
  });
}

enrollment.repository. js

const db = require('../models');
const enrollmentCount = db.enrollmentcount;

exports.getEnrollmentCount = (condition) => {
  return enrollmentCount.findAll({ where: condition} );
}
...