繁体   English   中英

我如何在 sql 查询中使用 express.js 变量

[英]how can i use express.js variables into sql queries

我是 node.js 的新手我正在尝试使用 express.js、vanilla JS、CSS、HTML 和MySql制作登录和注册系统。

下面是处理路由以及解析客户端发出的由用户名和密码组成的 HTTP Post 请求的代码。 用户名和密码存储在fields.usernamefields.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.usernamefields.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM