Подготовленные заявления с Node-MSSQL - PullRequest
0 голосов
/ 26 марта 2020

Я хочу сохранить данные API в SQL базе данных сервера с Node.js. Он уже работает с обычным запросом 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 -статум

Пока мне удалось сделать это здесь:

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)

Это пример JSON данных, которые я получаю от API:

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

Я надеюсь, что кто-то может помочь мне с этим.

1 Ответ

0 голосов
/ 27 марта 2020

Похоже, что ошибка происходит в следующей строке:

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

Я бы отладил значение, которое здесь присваивается, и посмотрел бы, подходит ли оно схеме, или если оно не определено.

Дополнительно в примечании, если вас беспокоит читабельность и инъекции SQL, рассмотрите возможность использования ORM. такие как Sequelize.

...