【问题标题】:how can i use express.js variables into sql queries我如何在 sql 查询中使用 express.js 变量
【发布时间】:2021-12-24 12:20:58
【问题描述】:

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

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

函数 userRegistration(...)userLogin(...) 在 db.js 中定义(显示在末尾);它们从db.js 导出并在users.js 中导入

users.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(查找提供的用户名和密码是否在数据库中)

db.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给出具体的代码。

【问题讨论】:

    标签: javascript mysql sql node.js express


    【解决方案1】:

    首先从

    更新此查询
    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。

    【讨论】:

      【解决方案2】:

      您可以使用模板文字来执行此操作。

      var username, password;
      const registrationQueryString = `INSERT INTO (username, password) userinfo VALUES ('${username}', '${password}')`
      

      然后使用registrationQueryString 作为原始查询。

      请记住,这是一个 ES2015 功能,应该在任何最新版本的 Node.js 中都可用。有关模板文字的更多信息,请访问MDN Web Docs

      【讨论】:

        【解决方案3】:

        "插入userinfo(用户名、密码)值('wer', 'wer');"

        【讨论】:

          【解决方案4】:

          目前无法添加评论。您是否尝试过将您的 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 查询更改为上述语法。提供的链接为您提供了正确的语法。

          【讨论】:

          • 您正在对 SQL 进行硬编码,这在登录注册过程中肯定不起作用。问题的全部意义在于找到一种将多个 express.js 变量嵌入到 SQL 中的方法
          • 如果您在最后一行错误中看到的更准确,您可以看到导致错误的 SQL 格式。您共享相同的格式。
          • @Het Tarkhala 如果你仔细观察,语法是不同的。切换 tbl_name 和 (col_name, ...)
          • 这是一个完美的解决方案,我没看懂文档(太吵了!)谢谢
          猜你喜欢
          • 2021-03-09
          • 2019-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-16
          • 1970-01-01
          相关资源
          最近更新 更多