[英]how can i use express.js variables into sql queries
我是 node.js 的新手我正在尝试使用 express.js、vanilla JS、CSS、HTML 和MySql
制作登录和注册系统。
下面是处理路由以及解析客户端发出的由用户名和密码组成的 HTTP Post 请求的代码。 用户名和密码存储在fields.username
和fields.password
函数userRegistration(...)
和userLogin(...)
在 db.js 中定义(显示在最后); 它们从db.js
导出并在users.js
中导入
用户.js
router.post('/register', (req, res, next) => {
const form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files) {
var userInfoArray = [fields.username, fields.password]
db.userRegistration(userInfoArray)
})
});
router.post('/login', (req, res, next) => {
const form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files) {
var userInfoArray = [fields.username, fields.password]
db.userLogin(userInfoArray)
})
});
我创建了userinfo
表来存储用户名和密码。 如下所示,我通过 HTTP post 方法获取用户名和密码。 我正在使用强大的模块进行解析,该模块为我提供了fields.username
和fields.password
值。 我正在使用 query(...) 方法查询数据库,提供实际 SQL 作为名为registrationQueryString
字符串(将条目插入表中)和loginQueryString
(查找提供的用户名和密码是否在数据库中)
数据库.js
var username, password;
var userInfoArray = [username, password]
const registrationQueryString = "INSERT INTO (username, password) userinfo VALUES ( ?, ? )"
const loginQueryString = "SELECT (username, password) FROM userinfo WHERE EXISTS (SELECT (username, password) FROM userinfo WHERE username = (?) AND password = (?))"
function userRegistration (userInfoArray){
dbConnection.query( registrationQueryString, userInfoArray, function(err, results, fields) {
if (err) throw err
console.log(results)
})
}
function userLogin (userInfoArray){
dbConnection.query( loginQueryString, userInfoArray, function(err, results, fields) {
if (err) throw err
console.log(results)
})
}
它给了我一个错误
“wer”是我作为用户名和密码提供的随机值
Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(username, password) userinfo VALUES ( 'wer', 'wer' )' at line 1
at Query.Sequence._packetToError (F:\dr.server\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
at Query.ErrorPacket (F:\dr.server\node_modules\mysql\lib\protocol\sequences\Query.js:79:18)
at Protocol._parsePacket (F:\dr.server\node_modules\mysql\lib\protocol\Protocol.js:291:23)
at Parser._parsePacket (F:\dr.server\node_modules\mysql\lib\protocol\Parser.js:433:10)
at Parser.write (F:\dr.server\node_modules\mysql\lib\protocol\Parser.js:43:10)
at Protocol.write (F:\dr.server\node_modules\mysql\lib\protocol\Protocol.js:38:16)
at Socket.<anonymous> (F:\dr.server\node_modules\mysql\lib\Connection.js:88:28)
at Socket.<anonymous> (F:\dr.server\node_modules\mysql\lib\Connection.js:526:10)
at Socket.emit (events.js:400:28)
at addChunk (internal/streams/readable.js:290:12)
--------------------
at Protocol._enqueue (F:\dr.server\node_modules\mysql\lib\protocol\Protocol.js:144:48)
at Connection.query (F:\dr.server\node_modules\mysql\lib\Connection.js:198:25)
at Object.userRegistration (F:\dr.server\db.js:29:18)
at F:\dr.server\routes\users.js:12:8
at zalgoSafe (F:\dr.server\node_modules\dezalgo\dezalgo.js:20:10)
at f (F:\dr.server\node_modules\once\once.js:25:25)
at IncomingForm.<anonymous> (F:\dr.server\node_modules\formidable\src\Formidable.js:183:9)
at IncomingForm.emit (events.js:400:28)
at IncomingForm._maybeEnd (F:\dr.server\node_modules\formidable\src\Formidable.js:612:10)
at QuerystringParser.<anonymous> (F:\dr.server\node_modules\formidable\src\plugins\querystring.js:36:10) {
code: 'ER_PARSE_ERROR',
errno: 1064,
sqlMessage: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(username, password) userinfo VALUES ( 'wer', 'wer' )' at line 1",
sqlState: '42000',
index: 0,
sql: "INSERT INTO (username, password) userinfo VALUES ( 'wer', 'wer' )"
}
我知道我的 SQL 查询有问题,但我无法弄清楚。 任何帮助将受到欢迎。 如果这些信息还不够,我可以通过 github 提供特定的代码。
还不能添加评论。 您是否尝试将 SQL 语句更改为:
INSERT INTO tbl_name (col_name, col_name) VALUES ('value', 'value')
"INSERT INTO userinfo (username, password) VALUES ( 'wer', 'wer' )"
https://dev.mysql.com/doc/refman/8.0/en/insert.html
编辑:
在您的帖子中:
它给了我一个错误
我知道我的 SQL 查询有问题,但我无法弄清楚。
上面的代码并不意味着是答案。 正如我之前提到的,目前无法发表评论。 上面的代码只是指向正确答案的指针。 您必须将 MySQL 查询更改为上述语法。 提供的链接为您提供了正确的语法。
您可以使用模板文字来做到这一点。
var username, password;
const registrationQueryString = `INSERT INTO (username, password) userinfo VALUES ('${username}', '${password}')`
然后使用registrationQueryString
作为原始查询。
请记住,这是一个 ES2015 功能,应该在任何最新版本的 Node.js 中可用。 更多关于MDN Web Docs 的模板文字
“插入userinfo
(用户名,密码)值('wer','wer');”
首先更新此查询
INSERT INTO (username, password) userinfo VALUES ( ?, ? )
到
INSERT INTO userinfo (username, password) VALUES ( ?, ? )
然后停止使用这种类型的查询
SELECT (username, password) FROM userinfo WHERE EXISTS (SELECT (username, password) FROM userinfo WHERE username = (?) AND password = (?))
将其替换为以下内容
const ObjQr = [
req.body.username,
req.body.password
];
const SsQl = "CALL SpSelectUser(?,?)";
query(SsQl, ObjQr, (err,results,fields) => {
if(err) {
res.send('ERROR');
}
else {
const Info= {
UserInfo : results[0]
};
res.json(Info);
}
});
尽量使用 StoredProcedure 而不是直接查询,以避免竞争条件和 Sql-Injection。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.