尝试使用参数化查询从前端进行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”。
2条答案
按热度按时间mjqavswn1#
您缺少一个
return
:如果没有这一点,当你得到一个错误,它会尝试调用
next
第一,然后尝试发送res.status(200)
,然后失败时,异常访问users
上的.rows
。这可能会使服务器崩溃,或者至少看起来会使默认错误处理程序发送的响应快速中止。您将代码转换为使用promise的解决方案(使用
async
/await
)要好得多,因为它避免了错误处理的陷阱。现在只要确保使用 * express.jsv5 *,它可以处理中间件返回的promise的拒绝。tv6aics12#
不确定是什么原因导致了这个问题,但我在
/server
中创建了一个新的db.js
文件(而不是使用const pool = require(__dirname + "/config/db.config.js");
)。我更新了
/server/index.js
:现在,通过Postman发送
GET http://localhost:3001/users/1
将返回user_id = 1
所在的行