Javascript 使用正确的数组响应HTTP请求时出现问题。使用expressjs从函数内部发送结果的可能方式?
问题摘要:所以我正在开发一个在后端有SQL数据库的程序,我正在使用NPMSqlite3模块与它对话。当我向服务器发出HTTP请求时,我在另一篇帖子中被告知,我应该在函数中执行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是一个异步函数,它是无效的,不能返回任何内容。我有一个回调函数,它在回调函数中发送对象,但我不
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正在逐渐摆脱使用回调来处理异步代码。