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

标签 javascript node.js http express node-sqlite3

问题摘要:我正在开发一个后端有 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/

相关文章:

javascript - 如何避免 iPad 上可触摸拖动的边框半径元素出现动画伪影?

node.js - 如何在 Express/node.js 应用程序中使用 mailgun/mailchimp/etc 发送电子邮件

http - 服务器端代码执行流程(golang)

javascript - 提示后 Yeoman 复制功能不起作用

javascript - 如何通过是否选中子项来更新父复选框?

javascript - promise 被拒绝时 AngularJS 服务重试

node.js - 如何访问在连接到具有公共(public) IP 的 Android 设备的 wifi 热点的计算机上运行的 NodeJs HTTP 服务器?

node.js - 使用 Mongoose 查询单独检索每个子文档而不传递父 ID

javascript - 如何使用 Node.js 将 http 请求中的图像显示到外部 API

ruby-on-rails - 通过 http POST 在 Ruby on Rails 应用程序中创建对象的最合适方法是什么?