NodeJS 参数化查询导致ESCURED ABORTED

vyswwuz2  于 12个月前  发布在  Node.js
关注(0)|答案(2)|浏览(91)

尝试使用参数化查询从前端进行GET调用,以选择user_id = 1的行中的用户名。硬编码查询工作正常,但参数化查询会导致请求中止,并在dev-tools控制台中返回以下错误:

message: "Request aborted", name: "AxiosError", code: "ECONNABORTED", config: {…}, request: XMLHttpRequest }

编辑:我已经编辑了我的代码,试图缩小问题的范围。编辑2:再次编辑,可能已经不同步
/server/index.js

require("dotenv").config({ path: __dirname + "/.env" });
const express = require('express');
const pool = require(__dirname + "/config/db.config.js");   // *
 
const app = express();
 
const PORT = process.env.PORT || 3001;
 
const getUsers =  (req, res, next) => {  
  let userID = Number(req.query.user_id);
  pool.query('SELECT * FROM users WHERE user_id = 1', (error, users) => {
    if (error) {
      next(error)
    }
    res.status(200).json(users.rows)
    console.log(userID)
  })
}
 
app.get('/users', getUsers)

app.get("/", (req, res) => {
  res.send("Hello World!");
});
 
app.listen(PORT, () => {
    console.log(
    `# Server started on port: ${PORT}`);
})

问题是,当我尝试使用参数化查询时,请求失败。上面的硬编码user_id = 1可以工作,并输出正确的行。但以下失败:

const getUsers =  (req, res, next) => {  
  let userID = Number(req.query.user_id);
  pool.query('SELECT * FROM users WHERE user_id = $1', [userID], (error, users) => {
    if (error) {
      next(error)
    }
    res.status(200).json(users.rows)
    console.log(userID)
  })
}

当我GET http://localhost:3001/users?user_id=1与这些变化, Postman 只是显示“发送请求.”无休止。而对于硬编码的user_id = 1,Postman返回正确的行,并且服务器控制台在每个GET请求处显示“1”。

mjqavswn

mjqavswn1#

您缺少一个return

const getUsers =  (req, res, next) => {  
  let userID = Number(req.query.user_id);
  pool.query('SELECT * FROM users WHERE user_id = $1', [userID], (error, users) => {
    if (error) {
      return next(error)
//    ^^^^^^
    }
    res.status(200).json(users.rows)
    console.log(userID)
  })
}

如果没有这一点,当你得到一个错误,它会尝试调用next第一,然后尝试发送res.status(200),然后失败时,异常访问users上的.rows。这可能会使服务器崩溃,或者至少看起来会使默认错误处理程序发送的响应快速中止。
您将代码转换为使用promise的解决方案(使用async/await)要好得多,因为它避免了错误处理的陷阱。现在只要确保使用 * express.jsv5 *,它可以处理中间件返回的promise的拒绝。

tv6aics1

tv6aics12#

不确定是什么原因导致了这个问题,但我在/server中创建了一个新的db.js文件(而不是使用const pool = require(__dirname + "/config/db.config.js");)。

const { Pool } = require('pg');

const pool = new Pool({
  user: '[USERNAME]',
  host: '[HOST_IP]',
  database: '[DB_NAME]',
  password: '[PASSWORD]',
  port: 5432, 
});

module.exports = pool;

我更新了/server/index.js

// /server/index.js
const express = require('express');
const pool = require('./db'); // Path to your db.js file

const app = express();

app.get('/users/:user_id', async (req, res) => {
  const userID = req.params.user_id;
  
  try {
    const query = 'SELECT * FROM users WHERE user_id = $1';
    const result = await pool.query(query, [userID]);

    res.json(result.rows);
  } catch (error) {
    console.error('Error executing query:', error);
    res.status(500).json({ error: 'Internal Server Error' });
  }
});

const PORT = process.env.PORT || 3001;
app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

现在,通过Postman发送GET http://localhost:3001/users/1将返回user_id = 1所在的行

相关问题