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,例如:身份验证,用户、产品等可以使用和重复使用的控制器数量。
我希望这个答案可以引导您更接近您的成就。
我是 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,例如:身份验证,用户、产品等可以使用和重复使用的控制器数量。
我希望这个答案可以引导您更接近您的成就。