【问题标题】:Accessing the query result of the controller in express在 express 中访问控制器的查询结果
【发布时间】:2020-04-13 05:47:44
【问题描述】:

先生们美好的一天,这里是 react 的初学者,表达 mvc 架构...

我知道这是一个 react.js 社区,但我会问服务器端..

我基于应用程序创建 express-mysql-react 应用程序的教程

教程的一部分讨论了 mvc 架构的创建,它创建了一个代表数据库表的模型,用于查询连接的控制器,然后将结果用作 api..我已经完成了教程的基本目标和我想扩展它。

我的目标是将legend.controller.js的findAll()函数的结果获取到我的enrollmentcount.controller.js的findAll()函数中,因为我想用legend控制器的查询结果来查询注册数控制器的findAll()。

到目前为止,这些是收集到的代码

这是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.controller.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);

};

我是这项技术的新手,非常抱歉并提前感谢您

【问题讨论】:

  • 你知道回调吗?

标签: javascript mysql node.js model-view-controller sequelize.js


【解决方案1】:

一些建议,希望对您有所帮助。

  • 我建议在控制器和数据库之间添加另一层。我喜欢使用的一个常见模式是控制器 => 服务 => 存储库。控制器接收请求,提取/验证服务需要的数据,调用服务并返回结果。该服务可以执行业务逻辑,例如将来自多个数据库调用的数据拼凑在一起,数据处理等。存储库仅负责与数据库交互。例如,创建记录或加载它们。

  • 如果你把从数据库加载数据的代码移到控制器之外,就像我上面描述的那样,两个控制器可以使用服务层来获取数据,而不必将控制器耦合在一起。

  • 如果要在另一个模块中使用 getCurrentYearSem 函数,则需要导出它。

  • cursemyear 是一个承诺,它将解析为 getCurrentYearSem 函数返回的值。需要访问该值的代码需要在“then”方法中,或者您可以使用 async/await 暂停函数执行,直到该值被解析。在您的情况下,在enrollmentcount.controller.js 中的findall 函数签名之前添加异步,然后更改'const currsemyear = legend.getCurrentYearSem().then(function(result){console.log(result.semester);});' to 'const currsemyear = await legend.getCurrentYearSem(); Google 'mdn async await' 并查看有关 async/await 的 mozilla 文档以了解更多详细信息。

  • 除了 log 语句之外,您实际上并没有在任何地方使用 cursemyear 值

这是一个简短的例子,向您展示我的意思(未经测试,因此您必须稍微清理一下):

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} );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2016-07-02
    相关资源
    最近更新 更多