【问题标题】:Why is POST request with pool.query only works intermittently when using :id in the middle of URL?为什么在 URL 中间使用 :id 时,带有 pool.query 的 POST 请求只能间歇性地工作?
【发布时间】:2023-03-22 16:19:01
【问题描述】:

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

我的目标是创建一个 HTTP POST,它将为帖子创建 cmets 并将评论添加到数据库 cmets 表中。我相信这需要执行 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);

      
    }
  );
});

奇怪的是这工作了两次然后停止工作。 cmets 表中有两个条目,但任何进一步的帖子都不会做任何事情。这仅适用于 cmets 表单,尚不适用于 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)
);

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

非常感谢您的任何指导。

【问题讨论】:

  • 'INSERT INTO comments(comment_body) VALUES($1)' 您提供[post_id, comment_body] 作为值,但只插入一个值。可能您想要'INSERT INTO comments(post_id, comment_body) VALUES($1, $2)' 之类的东西。
  • 谢谢,是的,我曾尝试从括号中删除 post_id,但无论出于何种原因,它都返回了代理错误。但是,您的想法确实对我有用。我没有进行加入(不起作用),而是完全删除了该请求。然后我按照你的建议做了,只是在初始插入中添加了 post_id 。我没有考虑过在不使用连接的情况下导入参数。

标签: sql reactjs postgresql express post


【解决方案1】:

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

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 的想法。

我还添加了 async/await。

【讨论】:

    猜你喜欢
    • 2014-07-16
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2020-02-04
    • 1970-01-01
    相关资源
    最近更新 更多