Не вывести данные с помощью функции
Здравствуйте.
Есть функция, которая выводит данные из БД, но я не могу с этими данными работать. Хочу присвоить эти данные в переменную и обращаться к ним как к элементам массива.
var sql = "select * from table";
function getData(query, cb) {
var mssql = require('mssql');
var config = {
...
}
}
var connection = new mssql.connect(config, function(err) {
if (typeof err !== "undefined" && err !== null) {
cb(err);
return
}
var request = new mssql.Request(connection);
request.query(query, function(err, recordset) {
var data = {field1: [],field2: []};
for(var i = 0; i < recordset.recordset.length; i++){
data.field1.push(recordset.recordset[i].field1);
data.field2.push(recordset.recordset[i].field2);
}
if (cb) {
cb(null, data);
}
mssql.close();
});
});
}
var getArr = getData(sql);
console.log(getArr.field1[0]);
console.log(getArr.field2[0]);
|
shirokovea, я не знаком с серверным js, но, судя по коду, функция «getData» принимает 2 параметра: сам запрос и callback-функцию.
Вероятно запрос к бд происходит асинхронно. Чтобы получить данные и начать с ними работать, нужно использовать функцию примерно так:
getData(sql,function(_null,rows){
console.log(rows.field1[0]);
console.log(rows.field2[0]);
});
Сама функция несколько странная. Во-первых, непонятно почему она читает только 2 поля каждой строки вместо всех, во-вторых, непонятно зачем callback'у передавать первым аргументом null. Как уже написал ранее, с серверным js я не знаком, поэтому могу ошибаться. |
Если использовать функцию так, то все работает. Но мне нужно сделать именно так:
var getArr = getData(sql); console.log(getArr.field1[0]); console.log(getArr.field2[0]); Если такое вообще возможно. А по поводу функции, 2 поля это для примера. Передавать null не принципиально. |
Цитата:
Возможно кто-нибудь другой сможет вам помочь. |
Цитата:
как вариант, слегонца переписать getData, чтобы возвращала промис. тогда в коде можно будет использовать моднейшие хипстерские async/await, внешне это выглядит почти как то что надо. |
Цитата:
|
примерно так. Вроде бы нода последних версий умеет async/await
var sql = "select * from table";
function getData(query) {
return new Promise(function(resolve, reject) {
var mssql = require('mssql');
var config = {
...
}
}
var connection = new mssql.connect(config, function(err) {
if (typeof err !== "undefined" && err !== null) {
reject(err);
return
}
var request = new mssql.Request(connection);
request.query(query, function(err, recordset) {
if (err != null) {
reject(err);
} else {
var data = {field1: [],field2: []};
for(var i = 0; i < recordset.recordset.length; i++){
data.field1.push(recordset.recordset[i].field1);
data.field2.push(recordset.recordset[i].field2);
}
resolve(data);
}
mssql.close();
});
});
});
}
async function main() {
var getArr = await getData(sql);
console.log(getArr.field1[0]);
console.log(getArr.field2[0]);
}
main();
|
Цитата:
Что-нибудь наподобие:
async function main() {
var getArr = await getData(sql);
return getArr;
}
var bar = main();
console.log(bar.field[0]);
Если так пытаюсь сделать, то на выводе вижу Promise {<pending>} |
| Часовой пояс GMT +3, время: 14:36. |