Javascript 使用正确的数组响应HTTP请求时出现问题。使用expressjs从函数内部发送结果的可能方式?

Javascript 使用正确的数组响应HTTP请求时出现问题。使用expressjs从函数内部发送结果的可能方式?,javascript,node.js,http,express,node-sqlite3,Javascript,Node.js,Http,Express,Node Sqlite3,问题摘要:所以我正在开发一个在后端有SQL数据库的程序,我正在使用NPMSqlite3模块与它对话。当我向服务器发出HTTP请求时,我在另一篇帖子中被告知,我应该在函数中执行res.send,这样在函数运行后,它将返回函数中的任何内容。很简单,对吧?但是后来我遇到了一个异步函数的问题。本质上,我调用了我的数据库,它将数据库中的所有内容返回给database.all中的一个对象,但database.all是一个异步函数,它是无效的,不能返回任何内容。我有一个回调函数,它在回调函数中发送对象,但我不

问题摘要:所以我正在开发一个在后端有SQL数据库的程序,我正在使用NPMSqlite3模块与它对话。当我向服务器发出HTTP请求时,我在另一篇帖子中被告知,我应该在函数中执行
res.send
,这样在函数运行后,它将返回函数中的任何内容。很简单,对吧?但是后来我遇到了一个异步函数
的问题。本质上,我调用了我的数据库,它将数据库中的所有内容返回给database.all中的一个对象,但database.all是一个异步函数,它是无效的,不能返回任何内容。我有一个回调函数,它在回调函数中发送对象,但我不知道如何处理它,或者我是否需要回调函数

所以我的问题是:我可以从
.all
函数或回调函数中的某个地方发送HTTP响应吗,或者我的函数必须将数组返回到调用它的位置吗?下面的代码告诉你我的意思

事件链:

我已经设置了一个angular控制器,以便在加载页面时发送以下HTTP请求:

$http.get('/LoadWaitingList')
.then(function(response) {
    // alert("HTTP request set, getting data");
    console.log(response.data);
});
当服务器(server.js)收到它时,我会这样做:

app.get('/LoadWaitingList', function (req, res) {
  res.send(DatabaseFunction.loadWaitingList());
})
它在另一个名为test.js的文件中运行loadWaitingList()函数:

function  loadWaitingList() {
    var callbackFunction = function(err, response){
        var returnRow = response;
        return returnRow;
    }
    updateDB.Manager(callbackFunction);
}
它调用了
updateDB.Manager
,也就是这个家伙:

Manager : function(callback){
    var fs = require("fs");
    var file = "./Source/Server/Data/DaycareDB.db";
    var exists = fs.existsSync(file);
    if (!exists) {
        throw new Error("File not Found");
    }
    var sqlite3 = require("sqlite3").verbose();
    var db = new sqlite3.Database(file);
    db.all("SELECT * FROM WaitingList", function(err, row) {
        if (err){
            callback(err);
            return;
        }
        // console.log(row[0].ChildName);                   
        callback(null, row);
        return;
    });
},
最后我们可以看到,在
db.all
运行之后,我在
行中查找的值
row
被传递到
db。all
作为一个参数并作为数组返回,我尝试在
db.all
外部声明它,并传入它,然后打印出结果,但由于
db。all
是异步的,它总是空的,因为函数还没有运行

在调用回调后运行回调并检查对象(使用vscode调试器)时,
returnRow
中包含来自数据库的正确数据


如何将放入
并最终返回
的数据作为响应发送回去?当我们以不同的方式获得HTTP请求时,是否可以执行初始函数调用,然后从回调或其他方式执行res.send

app.get('/LoadWaitingList', function (req, res) {
  DatabaseFunction.loadWaitingList(function(err,data){
    if(err) {
      // handle the error here
    }
    // send the data
    res.send(data);
  }
});
现在,
loadWaitingList()
需要将标准错误第一次回调作为参数。此回调将传递到将在其中执行的
updateDB.Manager()

function loadWaitingList(callback) {
  updateDB.Manager(callback);
}

你需要看看你的回电

app.get('/LoadWaitingList', function (req, res) {
  DatabaseFunction.loadWaitingList(function(err,data){
    if(err) {
      // handle the error here
    }
    // send the data
    res.send(data);
  }
});
现在,
loadWaitingList()
需要将标准错误第一次回调作为参数。此回调将传递到将在其中执行的
updateDB.Manager()

function loadWaitingList(callback) {
  updateDB.Manager(callback);
}

您需要将回调传递到
loadWaitingList
函数中,然后从回调内部触发
res.send
。比如:

app.get('/LoadWaitingList', function (req, res) {
  DatabaseFunction.loadWaitingList(function(err, response) {
    res.send(response);
  });
});

function loadWaitingList(callback) {
  updateDB.Manager(callback);
}
这样,直到您的
loadWaitingList
功能完成,才会触发
res.send
。显然,这段代码非常基本。我没有检查错误,
loadWaitingList
只是将提供的
callback
传递给
Manager
方法。您可能会对其进行重构,并将
loadWaitingList
全部删除

app.get('/LoadWaitingList', function (req, res) {
  updateDB.Manager(function(err, response) {
    res.send(response);
  });
});
请记住,要异步运行的任何代码都必须位于回调内部。原始代码中的
res.send
不在回调中,因此它会立即运行。因此,它是在
loadWaitingList
返回值之前完成的


希望这有帮助。

您需要将回调传递到
loadWaitingList
函数中,然后从回调内部触发
res.send
。比如:

app.get('/LoadWaitingList', function (req, res) {
  DatabaseFunction.loadWaitingList(function(err, response) {
    res.send(response);
  });
});

function loadWaitingList(callback) {
  updateDB.Manager(callback);
}
这样,直到您的
loadWaitingList
功能完成,才会触发
res.send
。显然,这段代码非常基本。我没有检查错误,
loadWaitingList
只是将提供的
callback
传递给
Manager
方法。您可能会对其进行重构,并将
loadWaitingList
全部删除

app.get('/LoadWaitingList', function (req, res) {
  updateDB.Manager(function(err, response) {
    res.send(response);
  });
});
请记住,要异步运行的任何代码都必须位于回调内部。原始代码中的
res.send
不在回调中,因此它会立即运行。因此,它是在
loadWaitingList
返回值之前完成的


希望这有帮助。

WOAH!!!我不知道你能做到。我现在觉得错过了这一点很愚蠢,但非常感谢你!!!!:)因此,回答得比我快的+1更有意义@Ryan,如果您刚刚开始学习javascript/node,我强烈推荐以下书籍:。它们非常好,可以免费在线阅读。我还强烈建议研究这些书中所涉及的承诺和生成器。Javascript正在远离使用回调来处理异步代码。哇!!!我不知道你能做到。我现在觉得错过了这一点很愚蠢,但非常感谢你!!!!:)因此,回答得比我快的+1更有意义@Ryan,如果您刚刚开始学习javascript/node,我强烈推荐以下书籍:。它们非常好,可以免费在线阅读。我还强烈建议研究这些书中所涉及的承诺和生成器。Javascript正在逐渐摆脱使用回调来处理异步代码。