javascript - 在 express 中访问 Controller 的查询结果

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

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

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

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

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

我的目标是将legend.controller.js 的findAll() 函数的结果获取到我的enrollmentcount.controller.js 的findAll() 函数中,因为我想用legend Controller 的查询结果来查询注册计数 Controller 的 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. "});
    });

};

注册计数.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);

};


图例.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);

};

我对这项技术完全陌生,很抱歉,提前谢谢你

最佳答案

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

  • 我建议在您的 Controller 和数据库之间添加另一层。我喜欢使用的一个常见模式是 Controller => 服务 => 存储库。 Controller 接收请求,提取/验证服务需要的数据,调用服务并返回结果。该服务可以执行业务逻辑,例如将来自多个数据库调用的数据拼凑在一起,数据处理等。存储库仅负责与数据库交互。例如,创建记录或加载它们。
  • 如果你把从数据库加载数据的代码移到 Controller 之外,就像我上面描述的那样,两个 Controller 可以使用服务层来获取数据,而不必将 Controller 耦合在一起。
  • 如果要在另一个模块中使用它,则需要导出 getCurrentYearSem 函数。
  • cursemyear 是一个 promise ,它将解析为 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 文档以了解更多详细信息。
  • 除了日志语句
  • 之外,您实际上并没有在任何地方使用 cursemyear 值。

    这是一个简短的示例,可以向您展示我的意思(未经测试,因此您必须对其进行一些清理):

    注册计数.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']
      });
    }
    

    注册.repository.js
    const db = require('../models');
    const enrollmentCount = db.enrollmentcount;
    
    exports.getEnrollmentCount = (condition) => {
      return enrollmentCount.findAll({ where: condition} );
    }
    

    关于javascript - 在 express 中访问 Controller 的查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61182193/

    相关文章:

    javascript - 如何在 Windows Phone 8 操作系统中的诺基亚 lumia 925 中禁用 Internet Explorer 中的 Java 脚本?

    javascript - 如何将截取的 javascript 转换为 coffeescript

    PHP根据条件比较关联数组

    node.js - 使用 ExcelJS 将多个工作表添加到流工作簿

    javascript - 在 `Then` 内调用相同的 promise

    javascript - 在计算方法中显示混合数组

    javascript - 将大型 XML 文件转换为关系数据库

    php - 像elasticsearch一样从mysql数据库中搜索数据

    php - 如何将 Joomla mySQL 数据库移动到 Mariadb

    node.js - 如何找到我的 mongoDB 的远程 URL 以在我的 Node.js 代码中使用?