使用正确的数组响应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请求时,我在另一篇文章中被告知,我应该用函数内部的函数做一个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.send
在loadWaitingList
函数完成之前不会被触发。显然,这段代码是非常基础的。我没有检查错误,loadWaitingList
只是将提供的callback
传递给Manager
方法。你可以重构它,把loadWaitingList
全部去掉。
app.get('/LoadWaitingList', function (req, res) {
updateDB.Manager(function(err, response) {
res.send(response);
});
});
请记住,任何想要异步运行的代码都必须在回调中。原始代码中的res.send
不在回调中,因此它立即运行。因此,在loadWaitingList
返回值之前,它已经完成了。
- 我可以从内部函数中产生吗?
- 从内部函数javascript内部分配外部函数的对象
- 将外部函数返回的id传递给内部函数
- 重复调用的同一函数会重置setTimeout内部函数
- Javascript中的内部函数作用域
- 对象内部函数内的对象文本的范围
- 内部函数不会为外部函数在 jQuery 中动态创建的元素赋值
- JavaScript 如何定义内部函数
- bluebird promise catch() 没有使用 Promise.CancelError 调用内部函数
- JavaScript 在内部函数中保留一个 var
- 如何使用Javascript访问内部函数
- 使用从内部函数返回的异步数据对外部函数返回promise
- Javascript对象看不到内部函数
- 为什么可以在内部函数成员中访问对象引用,而不能在内部属性成员中访问
- 如何将参数传递到内部函数中
- JavaScriptEs6在内部函数中引用了这一点
- 需要将内部函数绑定到元素的单击事件
- 将此对象传递给JavaScript中的内部函数
- JavaScript 面向对象的调用函数内部函数或调用函数 insede var
- 从内部函数内部突破while循环'的身体