Javascript Nodejs控制器混乱不堪

Javascript Nodejs控制器混乱不堪,javascript,node.js,express,backend,Javascript,Node.js,Express,Backend,我对javascript、node.js(或后端)还是个新手。我正在尝试为登录页面请求创建一个控制器,但我对从MYSQL表获取数据、用户身份验证以及使用JWT包感到困惑 在我的控制器中,我首先检查用户表中的用户输入是否可用(使用一个简单的存储过程),然后比较数据库密码和用户输入,然后我想在有限的时间内创建一个令牌。(我看过一些关于JWT的教程视频,没有问题),我的主要问题是想知道如何用这个函数编写一个合适的控制器 我还有两个问题: 1.从路由内的MySQL表中获取数据是否正确、安全?或者我应该为

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

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

我还有两个问题:

1.从路由内的MySQL表中获取数据是否正确、安全?或者我应该为我的控制器创建一个JS类?(我有点困惑和怀疑)

2.假设
comparePassword()
返回
true
,如何在
db.query
回调函数范围之外继续编码?因为我必须在
db.query
callback中执行
comparePassword()

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')
 }
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
login.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')
 }
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)或操作(ADR)是调用的入口点,一个好的做法是使用这些入口点基本上:

  • 实例化支持请求的服务/类/域类
  • 调用必要的方法/函数来解决所需问题
  • 发出响应
此示例项目可以帮助您按照设计模式构建项目:

第二个问题:db并继续此过程

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

还认为,如果令牌是正确的和有效的,您可能需要创建一些外部资源/服务来解决,但这将有助于您的工作。

此示例项目应为您提供一个有关如何在文件中确定功能范围的示例:

摘要

您可能需要考虑将功能拆分为作用域,以便可以单独使用它们,而不是将所有逻辑都放在控制器中,然后您将更接近可以在控制器中使用和重用的类/服务,如:Authentication、user、product等


我希望这个答案能引导你更接近你的成就。

谢谢。你能给我看一个简单好用的node.js应用程序和一个控制器类吗?(从Github或任何地方)。我已经搜索了很多关于这一点,我找不到任何简单易懂的初学者例子Hi@John,这一个可能会帮助你如何组织你的项目,这一个应该给你一个关于编码的例子,以及我在上面的文本中告诉你的。这可能不是最好的,但是我帮助它打开了你关于如何分发代码的思路。