Я пытаюсь использовать утомительный драйвер, основанный на некоторых примерах, для обработки набора результатов из 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», но тогда нам нужно ссылаться на столбцы по именам, а не по массиву.