首页 > 解决方案 > 在 Mongoose 中传递给对象数据哈巴狗

问题描述

现有代码是作为 MySQL 查询编写的,我现在正在努力将其转换为 Mongoose 查询。

我需要从主页获取按最近订阅年份排序的五个数据。

现有代码将此结果值带入数组。并且数据是通过pug view传递的,Mongoose好像带了Object的结果值。在这种情况下,我想知道如何通过 Pug 视图传递数据。

我检查了将数据从终端导入到 console.log,但出现了一个名为“发生错误[ERR_HTTP_HEADERS_SENT]: Cannot set heads after they are sent to the client并且没有数据传递给哈巴狗”的错误。我想知道为什么会出现这个问题。

【MySQL查询】

router.get("/", function (req, res, next) {
  // Main page Profile Data Process
  db.query(`SELECT * FROM user ORDER BY registerDate DESC LIMIT 5`, function (
    error,
    data
  ) {
    // Log Error
    if (error) {
      console.log(error);
    }
    res.render("main", {
      dataarray: data,
      _user: req.user,
      url: url
    });
  });
});

【猫鼬查询】

router.get("/", function (req, res, next) {
  let dataarray = [];
  let userData = db.collection("user").find().limit(5).sort({
    "created_at": -1
});
  userData.each(function (err, doc) {
    if (err) {
      console.log(err);
    } else {
      if (doc != null) {
        dataarray.push(doc)
      }
    }
    // console.log(dataarray.login)
    console.log(dataarray);
    res.render("main", {
      dataarray,
      _user: req.user
    })
  });
});

[哈巴狗文件]

each profile in dataarray
        .col-lg-4
          img.rounded-circle(src=`${profile.avatar_url}` alt='Generic placeholder image' width='140' height='140')
          h2=`${profile.login}`
          p=`${profile.bio}`
          p
            a.btn.btn-secondary(href=`/${profile.login}` role='button') View details »

标签: javascriptnode.jsmongoose

解决方案


您正在以多个块发送请求,节点/快递使用一个请求和一个响应。

发送到客户端后无法设置头部

是第二次调用 res.render 时发生的错误。此时,一个请求已经离开节点/快速进程,这告诉您您正在尝试违反一个请求/一个响应范式。

这是您的代码的一部分,您可以在其中看到为什么会发生这种情况。

router.get("/", function (req, res, next) {
  let dataarray = [];
  let userData = db.collection("user").find().limit(5).sort({
    "created_at": -1
});
  userData.each(function (err, doc) {

这部分代码将尝试为结果集中的每个项目发送响应。

像这样的东西会正常工作(我没有测试过):

router.get("/", function (req, res, next) {

  db.collection("user").find().limit(5).sort({ "created_at": -1 }, function(err, userData){

    res.render("main", {
      dataarray: userData,
      _user: req.user
    })

  });

});

换句话说,只需要一个 res.render 并将整个结果集传递给它。


推荐阅读