首页 > 解决方案 > 为什么在 URL 中间使用 :id 时,带有 pool.query 的 POST 请求只能间歇性地工作?

问题描述

我不太确定如何表达这个问题,因此请随时进行更正以根据需要进行改进。

我的目标是创建一个 HTTP POST,它将为帖子创建评论并将评论添加到数据库评论表中。我相信这需要执行 INSERT 和 JOIN 以将特定的 POST id 添加到评论中。

这是我第一次在一个查询中包含两个请求,所以我不确定这是否正确。我已经阅读了有关使用 UNION 的信息,但无法找出正确的语法,因为没有一个示例在他们的请求周围包含引号 ''。

我的发帖路线:

router.post(`/posts/:id/comments`, (request, response, next) => {
  const { id } = request.params; // tried with and without brackets {}
  const { comment_body } = request.body;

  // Testing for correct params
  console.log(id);
  console.log(comment_body);
  
  pool.query(
    'INSERT INTO comments(comment_body) VALUES($1)', 
    [post_id, comment_body],
    'SELECT * FROM comments JOIN posts ON posts.post_id = commments.post_id',
    (err, res) => {
      if (err) return next(err);

      
    }
  );
});

奇怪的是,这工作了两次然后停止工作。评论表中有两个条目,但任何进一步的帖子都不会做任何事情。这仅在评论表单中有效,在 Postman 中还没有

这在两个单独的测试中起作用。当在 id 周围使用方括号时,在表中创建了帖子,但在此表上没有加入 post_id:

 const { id } = request.params;

如果我不使用括号,则在数据表中创建了 post_id:

 const id = request.params;

这是我的表:

CREATE TABLE posts(
  post_id SERIAL,
  user_id INT,
  post_body CHARACTER varying(20000)
);

CREATE TABLE comments(
  id SERIAL,
  post_id INT,
  user_id INT,
  comment_body CHARACTER varying(20000)
);

最初我将评论的 post_id 设置为串行,但认为如果应该从 posts.post_id 加入,它可能需要是 INT。

非常感谢任何方向。

标签: sqlreactjspostgresqlexpresspost

解决方案


我设法通过以下方法解决了这个问题:

router.post(`/posts/:id/comments`,  async (request, response, next) => {
  
  try {

    const { id } = request.params; 
    const { comment_body } = request.body;
    
    await pool.query
      ('INSERT INTO comments(post_id, comment_body) VALUES($1, $2)', 
      [id, comment_body]);

  } catch(error) {

    console.log(error.message)
      
    }    
      
  
});

我没有使用 JOIN,而是将帖子 ID 参数包含在原始 INSERT 中并以这种方式导入。我最初认为我必须将其作为一个联接来执行,但无法获得第二个 SQL 请求才能工作。感谢snakecharmerb 的想法。

我还添加了异步/等待。


推荐阅读