Loops 如何在Express Route中多次调用同一api?

Loops 如何在Express Route中多次调用同一api?,loops,express,asynchronous,router,waterfall,Loops,Express,Asynchronous,Router,Waterfall,我正在使用Express开发一个节点应用程序。我将几个http调用链接到数据api,每个调用都依赖于前面的req响应 除了最后一个电话,一切正常。在呈现页面之前,需要多次执行最后一次调用 搜索提供了一些很好的例子,说明了如何链接,而不是每次使用不同的参数调用同一个API(或HTTP GET、数据端点等) 我正在尝试这样做: var getJSON=(选项,fn)=>{ ..... } 路由器路由(“/”) .get((请求、恢复)=>{ var-idArray=[]; var结果=[]; get

我正在使用Express开发一个节点应用程序。我将几个http调用链接到数据api,每个调用都依赖于前面的req响应

除了最后一个电话,一切正常。在呈现页面之前,需要多次执行最后一次调用

搜索提供了一些很好的例子,说明了如何链接,而不是每次使用不同的参数调用同一个API(或HTTP GET、数据端点等)

我正在尝试这样做:

var getJSON=(选项,fn)=>{
.....
}
路由器路由(“/”)
.get((请求、恢复)=>{
var-idArray=[];
var结果=[];
getJSON({
..在此处发送参数,(结果)=>{
//将响应添加到结果数组
结果。推(结果);
//为包含下次调用所需id参数的数据节点创建var
让group=result.groupsList;
//从每个组获取id密钥,保存到idArray

对于(i=0;i我了解了上述代码的问题

  • 您可以调用快速路线之外的函数,但不能在路线内部调用它们
  • 不能链接多个依赖数据的呼叫,路由中不能
  • 路由中的任何内容。get路由。post应与数据、路径、渲染等有关

    这意味着要么使用异步库(在尝试从多个数据源构建页面时,我发现它是无用的,数据依赖于前面的响应),要么使用(从web页面)调用的附加js文件要像下面这样获取、处理和建模您的数据:您还可以在路由之前将其放入应用程序或索引文件中

    (一开始,我并不清楚这些代码会去哪里。我试着把它放在我的router.post中。尽管上面写着“方法”,但它并没有告诉我路由就是方法。我以前只做过非常基本的路由,从来没有仔细看过。)

    最后,我选择了第三个选项。我在屏幕上分解了各种API调用,这样只有当用户单击需要更多数据的东西时,才会调用它们,比如手风琴或制表符开关

    我使用网页中的XMLHttpRequest()调用我自己的前端节点服务器,然后该服务器调用第三方API,然后前端节点服务器使用API提供的数据对我的pug文件进行呈现,并做出响应。我得到html,以便屏幕追加

    第页:

    callFEroutetoapi(_postdata, _route, function (_newdata){
                        putData(_newdata);
                    });
    
    function putData(tData){
                var _html = tData;
                var _target = document.getElementById('c-playersTab');
                applyHTML(_target, _html);
            }
    
    function callFEroutetoapi(data, path, fn){
        //url is express route
        var url = path;
        var xhr = new XMLHttpRequest();
    
        console.log('data coming into xhr request: ', data);
    
        //xhr methods must be in this strange order or they don't run
        xhr.onload = function(oEvent) {
            if(xhr.readyState === xhr.DONE) {
                //if success then send to callback function
                if(xhr.status === 200) {
                    fn(xhr.response);
                    // ]console.log('server responded: ', xhr.response);
                    }
                else {
                    console.log("Something Died");
                    console.log('xhr status: ', xhr.status);
                }
            }                
        }
        xhr.onerror = function (){console.log('There was an error.', xhr.status);}
        xhr.open("POST", url, true);
        xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
        xhr.send(JSON.stringify(data));
    }
    

    它增加了一个额外的层,但对于显示最新的、经常变化的数据是必要的。它也是可重用的,这对于多屏幕web应用程序来说更好。如果视图较少(完全不同的屏幕和相互依赖的数据集),上面提到的更集中的model.js文件会更好。

    我了解了上面代码的问题

  • 您可以调用快速路线之外的函数,但不能在路线内部调用它们
  • 不能链接多个依赖数据的呼叫,路由中不能
  • 路由中的任何内容。get路由。post应与数据、路径、渲染等有关

    这意味着要么使用异步库(在尝试从多个数据源构建页面时,我发现它是无用的,数据依赖于前面的响应),要么使用(从web页面)调用的附加js文件要像下面这样获取、处理和建模您的数据:您还可以在路由之前将其放入应用程序或索引文件中

    (一开始,我并不清楚这些代码会去哪里。我试着把它放在我的router.post中。尽管上面写着“方法”,但它并没有告诉我路由就是方法。我以前只做过非常基本的路由,从来没有仔细看过。)

    最后,我选择了第三个选项。我在屏幕上分解了各种API调用,这样只有当用户单击需要更多数据的东西时,才会调用它们,比如手风琴或制表符开关

    我使用网页中的XMLHttpRequest()调用我自己的前端节点服务器,然后该服务器调用第三方API,然后前端节点服务器使用API提供的数据对我的pug文件进行呈现,并做出响应。我得到html,以便屏幕追加

    第页:

    callFEroutetoapi(_postdata, _route, function (_newdata){
                        putData(_newdata);
                    });
    
    function putData(tData){
                var _html = tData;
                var _target = document.getElementById('c-playersTab');
                applyHTML(_target, _html);
            }
    
    function callFEroutetoapi(data, path, fn){
        //url is express route
        var url = path;
        var xhr = new XMLHttpRequest();
    
        console.log('data coming into xhr request: ', data);
    
        //xhr methods must be in this strange order or they don't run
        xhr.onload = function(oEvent) {
            if(xhr.readyState === xhr.DONE) {
                //if success then send to callback function
                if(xhr.status === 200) {
                    fn(xhr.response);
                    // ]console.log('server responded: ', xhr.response);
                    }
                else {
                    console.log("Something Died");
                    console.log('xhr status: ', xhr.status);
                }
            }                
        }
        xhr.onerror = function (){console.log('There was an error.', xhr.status);}
        xhr.open("POST", url, true);
        xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
        xhr.send(JSON.stringify(data));
    }
    
    它增加了一个额外的层,但对于显示最新的、经常变化的数据来说是必要的。它也是可重用的,这对于多屏幕web应用程序来说更好。如果视图较少(完全不同的屏幕和相互依赖的数据集),则上面提到的更集中的model.js文件会更好地工作