【问题标题】:Prepared statements with Node-MSSQL使用 Node-MSSQL 准备的语句
【发布时间】:2020-03-26 20:56:02
【问题描述】:

我想使用 Node.js 将 API 数据存储在 SQL Server 数据库中。正如您在下面的第一个代码中看到的那样,它已经适用于普通的 INSERT 查询。

   server.route({

        method: 'POST',
        path: '/',
        handler: async(request, h) => {

            try {
                await pool.query("INSERT INTO mytable(device,data,stationId,rssi,unix_timestamp)                              VALUES('"+request.payload.device+"','"+request.payload.data+"','"+request.payload.station+"',
'"+request.payload.rssi+"','"+request.payload.time+"')");

                return h.response('Callback received').code(200);
            }
            catch (err) {
                console.log("SQL Err", err.stack);
                return 'Error';
            }

        }

    });

现在我想稍微改进一下代码以避免 SQL 注入并获得更好的概览。

因此,我想使用本文档中描述的准备好的语句:https://www.npmjs.com/package/mssql#prepared-statement

到目前为止,我已经在这里做到了:

server.route({
    method: 'POST',
    path: '/',
    handler: async(request, h) => {


        const ps = new sql.PreparedStatement(pool)

        try {

        ps.input('device', sql.VarChar(10))
        ps.input('data', sql.VarChar(24))
        ps.input('station', sql.NChar(10))
        ps.input('rssi', sql.Float)
        ps.input('time', sql.Int)

            await ps.prepare('INSERT INTO mytable(device,data,stationId,rssi,unix_timestamp) VALUES(@device,@data,@station,@rssi,@time)');

            try {
              await ps.execute(
                { device: request.payload.device },
                { data: request.payload.data },
                { station: request.payload.station },
                { rssi: request.payload.rssi },
                { time: request.payload.time }
                )
            } finally {
              await ps.unprepare();
            }
            return h.response('Callback received').code(200);
        }
         catch (err) {
            console.log("SQL Err", err.stack);
            return 'Error';
        }
    }
});

并且出现以下错误:

at Parser.emit (events.js:223:5)
at Parser.<anonymous> (C:\Users\AW\sqltest\node_modules\tedious\lib\token\token-stream-parser.js:37:14)
at Parser.emit (events.js:223:5)
at addChunk (C:\Users\AW\sqltest\node_modules\readable-stream\lib\_stream_readable.js:297:12)
at readableAddChunk (C:\Users\AW\sqltest\node_modules\readable-stream\lib\_stream_readable.js:279:11)
at Parser.Readable.push (C:\Users\AW\sqltest\node_modules\readable-stream\lib\_stream_readable.js:240:10)
at Parser.Transform.push (C:\Users\AW\sqltest\node_modules\readable-stream\lib\_stream_transform.js:139:32)

这是我从 API 获得的 JSON 数据示例:

{
  "device":"887B53",
  "data":"4660000000000062b4a8",
  "station":"1B2C" 
  "rssi":"-123",
  "time":"1585258718"
}

我希望有人可以帮助我。

【问题讨论】:

    标签: node.js sql-server prepared-statement insert-query


    【解决方案1】:

    错误似乎发生在以下行:

    ps.input('站', sql.NChar(10))

    我会调试这里分配的值,看看它是否符合架构,或者它是否未定义。

    另外,如果您担心可读性和 SQL 注入,请考虑使用 ORM,例如 Sequelize。

    【讨论】:

    • 是什么让你认为是因为这条线?数据类型和字符串都合适。如果我取出输入,错误仍然存​​在。
    • 其实我收回了。似乎在您为语句转换参数时发生了错误,有些东西不兼容我看到您使用的是 float 类型,但您是直接从 JSON 输入 float/int 类型(RSSI 和 TIME),您是否尝试过将它们分别转换为 float 和 int?
    • 如果我取出这两个参数,我会得到同样的错误。正如我之前所说,如果我执行一个普通的 INSERT 查询,它就可以工作。我对 JSON 数据也是如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 2021-11-19
    • 2014-10-14
    • 2023-03-03
    • 2018-05-08
    • 2019-12-31
    相关资源
    最近更新 更多