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

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

问题总结:所以我正在开发一个在后端有一个 SQL 数据库的程序,我正在使用 npm SQLite3 模块与它对话。当我向服务器发出 HTTP 请求时,我在另一个 post 中被告知我应该使用其中的函数执行 res.send 因此在函数 运行 之后,它将 return 函数中的任何内容。够简单吧?但是后来我 运行 遇到了异步函数 .all (API Doc here) 的问题。本质上发生的事情是我调用我的数据库,它 return 将内部的所有内容都放入 database.all 的对象中,但是 database.all 是一个异步函数,它是无效的并且不能 return 任何事物。我有一个在回调中发送对象的回调,但我不知道从那里如何处理它,或者我什至是否需要回调。

所以我的问题是:我可以从我的 .all 函数或回调中的某处发送 HTTP 响应,还是我的函数必须 return 数组到它被调用的地方?下面的代码向您展示我的意思。

事件链(Github repo for refrence)

我已经设置了一个 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 运行s 之后,我在 row 之后的值。 row 作为参数传递给 db.all 并作为数组传递给 return,我尝试在 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);
}

这样,在您的 loadWaitingList 函数完成之前,不会触发 res.send。显然,这段代码非常基础。我没有检查错误,loadWaitingList 只是将提供的 callback 传递给 Manager 方法。您或许可以重构它并完全删除 loadWaitingList

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

请记住,您想要异步 运行 的任何代码都必须在回调中。您原始代码中的 res.send 不在回调中,因此立即 运行ning 。因此,它在 loadWaitingList 可以 return 一个值之前完成。

希望对您有所帮助。