Express/Mongoose 仅​​将部分请求数据保存到数据库

Posted

技术标签:

【中文标题】Express/Mongoose 仅​​将部分请求数据保存到数据库【英文标题】:Express/Mongoose is only saving partial request data to database 【发布时间】:2018-11-04 16:33:46 【问题描述】:

我认为这与我定义架构的方式有关,但我似乎无法找到错误所在...我有一个几乎相同的文件设置,它运行良好,但很遗憾我没有能够在任何地方找到此问题的副本。

当通过 Postman 向我的本地 Express 实例发送 API 请求时,只有“标题”请求正文值存储在数据库中。我将以下简单请求作为 Application/Json 发送到我的路由(认为使用 x-www-form-urlencoded 时也会发生同样的情况):


    "postTitle": "title goes here",
    "postContent": "body goes here",
    "isPublished": true

这显然是在express中注册的,好像我记录了我可以看到这些数据的对象(加上时间戳和一个_id):

 _id: 5b07d9c0b8124e0599079c04,
  postTitle: 'title goes here',
  postContent: 'body goes here',
  isPublished: true,
  createdAt: 2018-05-25T09:39:12.869Z,
  updatedAt: 2018-05-25T09:39:12.869Z,
  __v: 0 

但是,当我使用对象的 ID 向我的路由发送 get 请求时,我会收到以下响应:

 "_id": "5b07d9c0b8124e0599079c04" 

同样,如果我发送列出所有对象的请求,我会收到以下响应:


    "posts": [
        
            "_id": "5b07d9c0b8124e0599079c04"
        ,
        
            "_id": "5b07d9c0b8124e0599079c03"
        ,
        
            "_id": "5b07d9914f10ce058f137eba"
        
    ]

奇怪的是,有时作为响应的一部分发送的帖子标题包含在响应中,有时则不包含。

我的架构如下:

var postSchema = new Schema(
  postTitle: String,
  postContent: String,
  isPublished: Boolean
,

  timestamps: true
);

我的 POST 请求的 post API 路由如下:

router.post('/posts', (req, res, next) => 
  var postTitle = req.body.postTitle;
  var postContent = req.body.postContent;
  var isPublished = req.body.isPublished;
  var newPost = new Post(
    postTitle: postTitle,
    postContent: postContent,
    isPublished: isPublished
  );
  newPost.save(function (error) 
    if (error) 
      console.log(error)
    
    res.send(
      success: true,
      message: 'Post saved successfully!'
    )
  )
);

(如果您不使用路由器,您将使用 'app.post' 而不是 'router.post')再次,这有点冗长,但一切正常。

我的GET路线如下:

router.get('/posts', (req, res) => 
  Post.find(, 'title content published', function (error, posts) 
    if (error)  console.error(error); 
    res.send(
      posts: posts
    )
  ).sort(_id:-1)
);

【问题讨论】:

虽然这很好,但 Stack Overflow 用于“问题”和“答案”。您应该将“问题”与“答案”分开,而不仅仅是问题中的“博客”内容。发布您自己的答案很好,但这里的格式是“答案”是预期的。这都写在“问题”中了。 注意,谢谢。如果我在发布问题后找到了解决方案,我会这样做,但我在输入问题的过程中发现了它。我已对其进行了重新格式化,使其不像博客那样,以便可以将问题标记为已回答。 也许从“找到解决方案”中编辑其余部分,因为您现在已经添加了该位作为答案。 是的,我已经这样做了。我先添加了评论,这样我就可以更轻松地复制/粘贴相关内容,然后再将其从主帖中删除。我想在问题中包含我的错误,以明确指出问题所在。 【参考方案1】:

好的 - 因此,通过详细查看我的代码,我已经找出了哪里出错并解决了问题,但是,在我的搜索中,我发现的结果很少。我对 Express 很陌生,所以我将概述问题的原因以及我如何解决它,以便在其他人犯同样愚蠢的错误时可能为他们节省大量时间。

现在,我遇到的问题源于我检索数据并提供数据以响应获取请求的方式。例如,这是我列出所有对象的 GET 路由。

我完全专注于发布请求,并假设这是数据库的问题。事实证明,我实际上所做的是为了让我的模式和路由不那么混乱,我更改了相关变量的名称。然而,我忘记做的是在我的 GET 路由中更新这一行以反映更改:

  Post.find(, 'postTitle postContent isPublished', function (error, posts) 

我留下的是:

  Post.find(, 'title content published', function (error, posts) 

有时显示标题的原因是我尝试来回撤消更改以发现问题。

我知道这是一个超级基本的查询,但我在一天的大部分时间里都被困在这个问题上,唯一的其他相关讨论以 OP 说它神奇地修复了自己而告终。

【讨论】:

以上是关于Express/Mongoose 仅​​将部分请求数据保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose & Express:从子文档发布数据

Mongoose & Express:从子文档发布数据

Node.js / Express / Mongoose - 如何发送 JSON 以及对象视图?

NodeJS Express Mongoose 返回空 []

Angular|Express|Mongoose 得到 HttpErrorResponse 错误状态:404

node.js+express+mongoose实现用户增删查改案例