NodeJS SQL Server Утомительный TypeError: columns.forEach не является функцией - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь использовать утомительный драйвер, основанный на некоторых примерах, для обработки набора результатов из SQL Server, но всегда получаю ошибку «TypeError: columns.forEach is not function», и я не могу понять, почему это не такработает для меня.

Все модули установлены недавно с npm (2018.09.21).утомительная версия: tedious@2.6.4

Пример источников: https://docs.microsoft.com/en-us/sql/connect/node-js/step-3-proof-of-concept-connecting-to-sql-using-node-js?view=sql-server-2017

https://sqlchoice.azurewebsites.net/en-us/sql-server/developer-get-started/node/sles/step/2.html

Мой код:

var express = require('express');
var router  = express.Router();
var auth = require(__dirname +'/../lib/' + 'authorization');

const config = {
  server : 'servername',
  domain : 'MYDOMAIN',
  userName : 'MYUSER',
  password : 'MYPASSWORD',
  options : {
    rowCollectionOnRequestCompletion : true,
    database : 'MYDB',
    encrypt : true,
    connectionTimeout : 1000,
    requestTimeout : 0,
    useColumnNames : true,
    isolationLevel : 'READ_UNCOMITTED',
    appName : 'My nodejs app',
    connectionRetryInterval : 5000
  },
};

var Connection = require('tedious').Connection;
var Request = require('tedious').Request;
var TYPES = require('tedious').TYPES;
require('tedious').ISOLATION_LEVEL;

var connection;

router.post('/', auth.auth, async(req, res, next) => {
  try {
    connection = new Connection(config);
    connection.on('connect', function(err) {
      if (err)
      {
        console.log(new Date().toUTCString() + ' : Database connection failed to database : ' + config.options.database);
      }
      else
      {
          console.log(new Date().toUTCString() + ' : Database connected : ' + this.config.server + '.' + this.config.options.database + ' Status : ' + this.state.name);
          getList(res);
      }
    })
    .on('infoMessage', infoError)
    .on('errorMessage', infoError)
    .on('end', end)
    .on('debug', debug)
    .on('error', error)
    .on('databaseChange', databaseChange)
  }
  catch  (ex)
  {
    console.log(new Date().toUTCString() + ' : ' + 'Error: ' + ex.message);
    res.status(500);
    res.send(ex.message);
  }
});

function getList(res){
  var query = "SELECT * FROM sysfiles;";

  var request = new Request(query, function (err, rowCount, rows)
  {
    if (err)
    {
      console.log(new Date().toUTCString() + ' : ' + 'Error: ' + err);
      res.write('{ "error" : "' + err + '" }');
      res.end();
    }
    else
    {
      // console.log(rowCount + ' rows');
      var rowarray = [];
      rows.forEach(function(columns)
      {
        var rowdata = new Object();
        columns.forEach(function(column)
        {
          rowdata[column.metadata.colName] = column.value;
        });
        rowarray.push(rowdata);
      })

      res.contentType('application/json');
      retval = JSON.stringify(rowarray);
      //if (cb)
      //{
      //  retval = cb + '(' + retval + ');'
      //}
      res.write(retval);
      res.end();
    }
  // request.on('columnMetadata', columnMetadata);
  });

  request.on('done', requestDone);
  // request.addParameter('Pattern', TYPES.VarChar, '%' + pattern +'%');
  // request.addParameter('TOP', TYPES.Null, null);

  connection.execSql(request);
  // connection.callProcedure(request);
}

module.exports = router;

Сообщение об ошибкеЯ получаю:

C:\mypath\myapp\routes\route1.js:60

        columns.forEach(function(column)

                ^

TypeError: columns.forEach is not a function
    at C:\mypath\myapp\routes\route1.js:60:17
    at Array.forEach (<anonymous>)
    at Request.userCallback (C:\mypath\myapp\routes\route1.js:57:12)
    at Request._this.callback (C:\mypath\myapp\node_modules\tedious\lib\request.js:60:27)
    at Connection.endOfMessageMarkerReceived (C:\mypath\myapp\node_modules\tedious\lib\connection.js:1922:20)
    at Connection.dispatchEvent (C:\mypath\myapp\node_modules\tedious\lib\connection.js:1004:38)
    at Parser.<anonymous> (C:\mypath\myapp\node_modules\tedious\lib\connection.js:805:18)
    at Parser.emit (events.js:182:13)
    at Parser.<anonymous> (C:\mypath\myapp\node_modules\tedious\lib\token\token-stream-parser.js:54:15)
    at Parser.emit (events.js:182:13)
Waiting for the debugger to disconnect

Обновление

Как указали "Мэтт Кун" и "Подумайте дважды", проблема заключалась в типе столбцов.Спасибо им!

Проблема заключалась в том, что «useColumnNames: true» в разделе config.options.Удаление это решило проблему.Тогда мы можем использовать «useColumnNames: true», но тогда нам нужно ссылаться на столбцы по именам, а не по массиву.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вам нужно проверить столбцы, является ли он массивом или неопределенным, прежде чем делать forEach

  rows.forEach(function(columns)
  {
    var rowdata = new Object();
    if(columns){
       columns.forEach(function(column)
        {
           rowdata[column.metadata.colName] = column.value;
        });
    }
    rowarray.push(rowdata);
  });
0 голосов
/ 21 сентября 2018

Ваш код не вызывает событие request.on, которое утомительно раскрывает.Вы также можете проверить, что столбцы являются массивом, вызвав typeof.Ваша ошибка означает, что столбцы не являются массивом, на самом деле, вероятно, не определено.

Вот код из минимального примера на их сайте:

function executeStatement() {
  request = new Request("SELECT * FROM sysfiles", function(err, rowCount) {
    if (err) {
      console.log(err);
    } else {
      console.log(rowCount + ' rows');
    }

    connection.close();
  });

  request.on('row', function(columns) {
    console.log("columns", columns);  //should show your array
    console.log("typeof columns", typeof columns); //should by array
    columns.forEach(function(column) {
      if (column.value === null) {
        console.log('NULL');
      } else {
        console.log(column.value);
      }
    });
  });

  request.on('done', function(rowCount, more) {
    console.log(rowCount + ' rows returned');
  });

  // In SQL Server 2000 you may need: connection.execSqlBatch(request);
  connection.execSql(request);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...