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

Having issues responding to an HTTP request with the proper array. Possible way to send results from within function with expressjs?

本文关键字:内部 函数 expressjs 结果 方法 使用 数组 响应 HTTP 请求 问题      更新时间:2023-09-26

问题总结:所以我正在研究一个后端有SQL数据库的程序,我正在使用npm SQLite3模块与它交谈。当我向服务器发出HTTP请求时,我在另一篇文章中被告知,我应该用函数内部的函数做一个res.send,所以在函数运行后,它会返回任何来自函数的东西。很简单,对吧?但后来我遇到了一个异步函数.all (API文档在这里)的问题。实际上发生的是,我调用我的数据库它将里面的所有东西返回给数据库中的一个对象。除了数据库。All是一个异步函数,它是空的,不能返回任何东西。我有一个回调,它在回调中发送对象,但我不知道从那里该怎么处理它,或者我甚至不知道是否需要回调。

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

事件链(Github repo供参考):

我已经设置了一个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之后的值。row作为参数传递到db.all并作为数组返回,我尝试在db.all之外声明它并传递它,然后打印出结果,但由于db.all是异步的,它总是空的,因为函数还没有运行。

当我运行回调并在回调调用后检查对象(使用vscode调试器)时,returnRow从我的数据库中有适当的数据。

我如何发送被放入row和最终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);
}

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

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

这样,res.sendloadWaitingList函数完成之前不会被触发。显然,这段代码是非常基础的。我没有检查错误,loadWaitingList只是将提供的callback传递给Manager方法。你可以重构它,把loadWaitingList全部去掉。

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

请记住,任何想要异步运行的代码都必须在回调中。原始代码中的res.send不在回调中,因此它立即运行。因此,在loadWaitingList返回值之前,它已经完成了。