Javascript Nodejs控制器混乱不堪
我对javascript、node.js(或后端)还是个新手。我正在尝试为登录页面请求创建一个控制器,但我对从MYSQL表获取数据、用户身份验证以及使用JWT包感到困惑 在我的控制器中,我首先检查用户表中的用户输入是否可用(使用一个简单的存储过程),然后比较数据库密码和用户输入,然后我想在有限的时间内创建一个令牌。(我看过一些关于JWT的教程视频,没有问题),我的主要问题是想知道如何用这个函数编写一个合适的控制器 我还有两个问题: 1.从路由内的MySQL表中获取数据是否正确、安全?或者我应该为我的控制器创建一个JS类?(我有点困惑和怀疑) 2.假设Javascript Nodejs控制器混乱不堪,javascript,node.js,express,backend,Javascript,Node.js,Express,Backend,我对javascript、node.js(或后端)还是个新手。我正在尝试为登录页面请求创建一个控制器,但我对从MYSQL表获取数据、用户身份验证以及使用JWT包感到困惑 在我的控制器中,我首先检查用户表中的用户输入是否可用(使用一个简单的存储过程),然后比较数据库密码和用户输入,然后我想在有限的时间内创建一个令牌。(我看过一些关于JWT的教程视频,没有问题),我的主要问题是想知道如何用这个函数编写一个合适的控制器 我还有两个问题: 1.从路由内的MySQL表中获取数据是否正确、安全?或者我应该为
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)是调用的入口点,一个好的做法是使用这些入口点基本上:
- 实例化支持请求的服务/类/域类李>
- 调用必要的方法/函数来解决所需问题李>
- 发出响应李>
还认为,如果令牌是正确的和有效的,您可能需要创建一些外部资源/服务来解决,但这将有助于您的工作。
此示例项目应为您提供一个有关如何在文件中确定功能范围的示例: 摘要 您可能需要考虑将功能拆分为作用域,以便可以单独使用它们,而不是将所有逻辑都放在控制器中,然后您将更接近可以在控制器中使用和重用的类/服务,如:Authentication、user、product等我希望这个答案能引导你更接近你的成就。谢谢。你能给我看一个简单好用的node.js应用程序和一个控制器类吗?(从Github或任何地方)。我已经搜索了很多关于这一点,我找不到任何简单易懂的初学者例子Hi@John,这一个可能会帮助你如何组织你的项目,这一个应该给你一个关于编码的例子,以及我在上面的文本中告诉你的。这可能不是最好的,但是我帮助它打开了你关于如何分发代码的思路。