Nodejs 控制器很乱

Nodejs controller is being messy

我是 javascript、node.js(或后端)的新手。我正在尝试为登录页面请求创建一个控制器,但我对从 MYSQL table 和用户身份验证获取数据以及使用 JWT 包感到困惑!

在我的控制器中,我首先检查用户输入是否可用table(使用一个简单的存储过程),然后我比较数据库密码和用户输入,之后我想在有限的时间内创建一个令牌。 (我看过一些关于 JWT 的教程视频,没有问题),我的主要问题是弄清楚如何用这个功能编写一个合适的控制器?

我还有 2 个问题:

1.Is 它是从路由内的 MySQL table 获取数据的正确且安全的方法吗?或者我应该为我的控制器创建一个 JS class 吗? (我这里有点疑惑和疑惑)

2.Assuming comparePassword() returns true,如何在 db.query 回调函数范围之外继续编码?因为我必须在 db.query 回调

中执行 comparePasssword()

loginController.js :

const { validationResult } = require('express-validator');
const bcrypt = require('bcrypt');
const db = require('../../sqlConnection')

let comparePassword = (dbPass, inputPass) => {
  bcrypt.compare(inputPass, dbPass, function(err, result) {
     console.log(result)
 });
}

// for get request
exports.getController = (req, res) => {
  res.send('login')
}

// for post request
exports.postController = (req, res) => {
  let errors = validationResult(req)

  if(!errors.isEmpty()) {
     res.status(422).json({ errors: errors.array() })
  }
  
  // find data from MYSQL table

  let sql = `CALL findUser(?)`
  db.query(sql, [req.body.username], (err, res) => {
     if(err) console.log(err)
     //console.log(Object.values(JSON.parse(JSON.stringify(res[0]))))
     var data = JSON.stringify(res[0])
     data = JSON.parse(data).find(x => x)
     data ? comparePassword(data.password, req.body.password) : res.status(400).send('cannot find 
     user')
  })

  res.send('post login')
 }

login.js :

const express = require('express')
const router = express.Router()
const { check } = require('express-validator');
const loginCont = require('../api/controllers/loginController')

router.route('/')
  .get(
     loginCont.getController
   )
   .post(
       [
        check('username').isLength({min: 3}).notEmpty(), 
        check('password').isLength({min: 4}).notEmpty()
       ],
       loginCont.postController
    )

 module.exports = router

在我看来,您的问题似乎没有简单的答案,所以我会尝试给您一些指导,以便您找出代码中的漏洞。

第一个问题:MySQL和控制器上的业务逻辑

在像MVC or ADR这样的设计模式中(请在链接中查看流程详细信息)Controllers(MVC) 或 Actions(ADR) 是调用的入口点,是一种很好的做法基本上是使用这些入口点:

  • 实例化一个支持请求的service/class/domain-class;
  • 调用必要的method/function来解决你想要的;
  • 发出回复;

此示例项目可以帮助您了解如何按照设计模式构建项目:https://riptutorial.com/node-js/example/30554/a-simple-nodejs-application-with-mvc-and-api

第二题:db并继续处理

对于身份验证,我强烈建议您查看 OAuth 或 OAuth2 身份验证流程。 OAuth(2) 有一个生成令牌的过程,您可以使用该令牌随时签入控制器,从而使服务变得更加容易。

同时考虑到您可能需要创建一些外部 resources/services 来解决令牌是否正确有效,但这会有助于您的工作。

这个示例项目应该给你一个关于如何在文件中限定函数范围的例子:https://github.com/cbroberg/node-mvc-api

总结

您可能需要考虑将您的函数拆分到作用域中,这样您就可以单独使用它们,而不是将所有逻辑都放在控制器中,然后您将更接近 classes/services,例如:身份验证,用户、产品等可以使用和重复使用的控制器数量。

我希望这个答案可以引导您更接近您的成就。