2016-06-12 4 views
0

В настоящее время я пытаюсь получить данные из SQL-запроса в node.js, функция sql находится в другом файле, поэтому я экспортирую его как модуль, а затем вызываю функцию из index.js. Но когда я пытаюсь получить данные, функция возвращает нулевое значение.Извлечь данные из SQL-запроса Node.js

Вот мой код

index.js

var express = require("express"); 
var body_parser = require("body-parser"); 
var app = express(); 
var db = require('./dbhandler.js'); 

app.set("view engine", "jade"); 

app.get("/data",function(req,res){ 
    let data = db.select(); 
    res.send(data); 
}); 

app.get("/",function(req,res){ 
    res.render("index"); 
}); 

app.listen(8888); 

dbhandler.js

var sqlite3 = require("sqlite3"); 

const file = "hr"; 

exports.select = function(){ 

var lista = []; 

var db = new sqlite3.Database(file); 

db.all("SELECT * FROM usuarios", function(err,rows){ 

    let contador = 0; 

    rows.forEach(function (row) { 
      lista[contador] = row.nombre + ";" + row.cedula + ";" + row.edad + ";" + row.pais; 
    }); 
}); 

db.close(); 

return lista; 
} 

ответ

1

Node является асинхронным !!!. lista возвращается из модуля до завершения функции db.all.

Вам либо необходимо передать обратный вызов в функцию выбора, либо вернуть обещание. Подход обратного вызова будет выглядеть примерно так:

exports.select = function (cb){ 
    var lista = []; 
    var db = new sqlite3.Database(file);   
    db.all("SELECT * FROM usuarios", function(err,rows){ 
     if(err) return cb(err); 
     let contador = 0; 
     rows.forEach(function (row) { 
      lista[contador] = row.nombre + ";" + row.cedula + ";" + row.edad + ";" 
    + row.pais; }); 
     db.close(); 
     return cb(null, lists); 
}); 
} 
+0

Спасибо, сработало. Я начал изучать узел около 3 дней назад и никогда не пытался узнать о обратных вызовах до сих пор, поэтому я понятия не имел, как это исправить. –

+0

Отметить ответ как принятый, когда вы можете –

Смежные вопросы