【问题标题】:Send multiple data in a single request using Node.js使用 Node.js 在单个请求中发送多个数据
【发布时间】:2018-09-16 18:59:31
【问题描述】:

我想使用以下代码在单个 GET 请求中将来自不同 MongoDB 表的多个数据发送到同一个登录页面:

  • asbs 是 MongoDB 数据库表名
  • landingejs 文件名 (landing.ejs)

代码:

app.get("/", function(req, res) {
  as.find({}, function(err, founda) {
    if (err) {
      console.log(err);
    } else {
      res.render("landing", {
        a: founda
      });
    }
  });

  bs.find({}, function(err, foundb) {
    if (err) {
      console.log(err);
    } else {
      res.render("landing", {
        b: foundb
      });
    }
  });
});

我怎样才能做到这一点?

【问题讨论】:

    标签: html node.js mongodb express


    【解决方案1】:

    尝试以下方法:

    app.get("/",function(req,res){
    
        as.find({},function(err,founda){
            if(err){
                console.log(err);
            }else{
                bs.find({}, function(err2, foundb) {
                    if (err2) {
                        console.log(err2);
                    } else {
                        res.render("landing",{a:founda, b: foundb});
                    }
                });
    
    
            }
        });
    });
    

    基本上你需要在拨打a之后再拨打b。如果您希望同时执行它们,则需要查看promises

    上面的代码也需要更好的错误处理......

    【讨论】:

    • "如果你想同时做它们,你需要研究 promises" 不一定,他可以使用异步并行和回调样式
    • 如果 as 为空,则会发生错误,并且不会转到 else 块。所以 bs 和 render 语句取决于是否有效。如果 as 为空,应该不会影响 bs 的执行。
    【解决方案2】:

    如果您的输出依赖于 2 个异步操作,您需要将它们嵌套在回调或承诺或异步等待中

    app.get("/",function(req,res){
        as.find({},function(err,founda){
            if(err){
                console.log(err);
            }else{
              bs.find({},function(err,foundb){
                if(err){
                   console.log(err);
                }else{
                   res.render("landing",{a:founda,b:foundb});
                }
              });
            }
         });
      });
    

    // 异步并行示例

    async.parallel({
        one: function(callback) {
            as.find({}, function(err, founda) {
               if (err) {
                  callback(err, null);
               } else {
                  callback(null, founda);
               }
            });
        },
        two: function(callback) {
            bs.find({}, function(err, founda) {
               if (err) {
                  callback(err, null);
               } else {
                  callback(null, foundb);
               }
            });
        }
    }, function(err, results) {
        res.render("landing",{a:results.a,b:results.b});
    });
    

    【讨论】:

    • 我希望他们被处决,不分彼此。
    • 我添加了一个并行示例,它将独立运行它们,但您的最终渲染仍将在两个完成之后进行
    • 又是一个荒谬的问题。为什么要发送两个不同的 res.render。
    • @Rejat 请不要浪费你的时间。
    • @ŞükranEken,每个人都从某个地方开始。我很高兴 op 尝试了一些东西,即使它根本上是错误的。我认为您原始帖子的根本问题是您无法发回 2 个回复。
    猜你喜欢
    • 2019-05-31
    • 2021-06-06
    • 2022-12-05
    • 1970-01-01
    • 2016-03-29
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多