问题摘要:我正在开发一个后端有 SQL 数据库的程序,并且我正在使用 npm SQLite3 模块与其进行通信。当我向服务器发出 HTTP 请求时,我在另一篇文章中被告知我应该使用其中的函数执行 res.send ,以便在函数运行后,它将返回来自该函数的任何内容。够简单吧?但后来我遇到了异步函数 .all
(API Doc here) 的问题。 。本质上发生的情况是,我调用数据库,它将内部的所有内容返回到database.all内的对象中,但database.all是一个异步函数,它是无效的,不能返回任何内容。我有一个回调,可以在回调内发送对象,但我不知道如何处理它,或者我是否需要回调。
所以我的问题是:我可以从 .all
函数或回调中的某个位置发送 HTTP 响应,还是我的函数必须将数组返回到调用它的位置?下面的代码可以向您展示我的意思。
事件链(Github repo for refrence) :
我已经设置了一个 Angular Controller ,以便在页面加载时发送以下 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
包含来 self 的数据库的正确数据。
如何发送放入 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);
}
关于javascript - 使用正确的数组响应 HTTP 请求时出现问题。使用expressjs从函数内发送结果的可能方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40570790/