向 MongoDB 发送删除请求时连接被拒绝
Connection refused when sending delete request to MongoDB
我一直在学习有关 Next.js 的教程,该教程与 MongoDB 一起使用。通过 Postman 发送时,我的所有请求都工作正常,表明我的 API 正在按预期工作。我可以毫无问题地从 Postman 发送 POST、GET 和 DELETE 请求。
但是,当我通过按钮调用的函数发送 DELETE 请求时,我收到 ERR_CONNECTION_REFUSED 错误,没有任何其他信息。有人可以指出我在这里做错了什么吗?
这是代码
如您所见,我有一个更新按钮和一个删除按钮,分别用于生成控制台日志和调用函数。但是,更新按钮的 onClick
未触发,删除按钮的 onClick
在单击时出现连接被拒绝错误。
import axios from "axios"
import { useState } from "react"
export default function Index({ products }) {
const [productList, setProductList] = useState(products)
const handleDelete = async (id) => {
try {
const res = await axios.delete("http://localhost:3000/api/products/" + id)
setProductList(productList.filter((product) => product._id !== id))
} catch (error) {
console.log(error)
}
}
return (
<div className="container">
<h1 className="display-3 text-center my-5">Admin Dash</h1>
<div className="d-flex justify-content-center">
<div className="col-md-4">
<form action="">
<div className="my-3">
<label htmlFor="productName" className="form-label">Enter Product Name</label>
<input type="text" name="productName" className="form-control" id="productName" />
</div>
<div className="my-3">
<label htmlFor="productDesc" className="form-label">Enter Product Description</label>
<input type="text" name="productDesc" className="form-control" id="productDesc" />
</div>
<div className="my-3">
<label htmlFor="productPrice" className="form-label">Enter Product Price</label>
<input type="number" name="productPrice" className="form-control" id="productPrice" />
</div>
<div className="my-3 d-flex justify-content-center">
<button className="btn btn-primary btn-lg me-3">Upload Image</button>
<button className="btn btn-success btn-lg">Add Product</button>
</div>
</form>
</div>
</div>
<hr />
<div className="d-flex flex-column align-items-center">
<h1 className="display-3 my-3">Listed Products</h1>
<table className="table table-striped mb-5">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Product Name</th>
<th scope="col">Product Description</th>
<th scope="col">Product Price</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody>
{productList.map(product => (
<tr key={product._id}>
<th scope="row">{product._id}</th>
<td>{product.title}</td>
<td>{product.desc}</td>
<td>{product.prices[0]}</td>
<td>
<button className="btn btn-warning me-3" onClick={() => console.log("Test")}>Update</button>
<button className="btn btn-danger" onClick={() => handleDelete(product._id)}>Delete</button>
</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
)
}
export const getServerSideProps = async () => {
const productsList = await axios.get("http://localhost:3000/api/products")
return {
props: {
products: productsList.data
}
}
}
为了更好地衡量,这里还有 API 端点代码。
import dbConnect from "../../../lib/dbConnect"
import Product from "../../../models/Product"
export default async function handler(req, res) {
const { method, query:{ id} } = req
dbConnect()
if (method === "GET"){
try {
const product = await Product.findById(id)
res.status(200).json(product)
} catch (error) {
res.status(500).json(error)
}
}
if (method === "POST"){
try {
const product = await Product.create(req.body)
res.status(200).json(product)
} catch (error) {
res.status(500).json(error)
}
}
if (method === "DELETE"){
try {
await Product.findByIdAndDelete(id)
res.status(200).json("Product Deleted!")
} catch (error) {
res.status(500).json("Problem here")
}
}
}
所以经过一整夜的敲打我的脑袋,我弄清楚了问题出在哪里。在我的 handleDelete
函数中,以下行
const res = await axios.delete("http://localhost:3000/api/products/" + id)
将更改为:
const res = await axios.delete("http://internalIPhere:3000/api/products/" + id)
我的猜测是问题源于我 运行 我的虚拟机上的开发服务器并从主机 OS 访问它。由于 localhost
地址未在我的浏览器中解析,因此它无法到达 API 端点。我用虚拟机的 IP 替换 localhost
后,一切正常。
我一直在学习有关 Next.js 的教程,该教程与 MongoDB 一起使用。通过 Postman 发送时,我的所有请求都工作正常,表明我的 API 正在按预期工作。我可以毫无问题地从 Postman 发送 POST、GET 和 DELETE 请求。
但是,当我通过按钮调用的函数发送 DELETE 请求时,我收到 ERR_CONNECTION_REFUSED 错误,没有任何其他信息。有人可以指出我在这里做错了什么吗?
这是代码
如您所见,我有一个更新按钮和一个删除按钮,分别用于生成控制台日志和调用函数。但是,更新按钮的 onClick
未触发,删除按钮的 onClick
在单击时出现连接被拒绝错误。
import axios from "axios"
import { useState } from "react"
export default function Index({ products }) {
const [productList, setProductList] = useState(products)
const handleDelete = async (id) => {
try {
const res = await axios.delete("http://localhost:3000/api/products/" + id)
setProductList(productList.filter((product) => product._id !== id))
} catch (error) {
console.log(error)
}
}
return (
<div className="container">
<h1 className="display-3 text-center my-5">Admin Dash</h1>
<div className="d-flex justify-content-center">
<div className="col-md-4">
<form action="">
<div className="my-3">
<label htmlFor="productName" className="form-label">Enter Product Name</label>
<input type="text" name="productName" className="form-control" id="productName" />
</div>
<div className="my-3">
<label htmlFor="productDesc" className="form-label">Enter Product Description</label>
<input type="text" name="productDesc" className="form-control" id="productDesc" />
</div>
<div className="my-3">
<label htmlFor="productPrice" className="form-label">Enter Product Price</label>
<input type="number" name="productPrice" className="form-control" id="productPrice" />
</div>
<div className="my-3 d-flex justify-content-center">
<button className="btn btn-primary btn-lg me-3">Upload Image</button>
<button className="btn btn-success btn-lg">Add Product</button>
</div>
</form>
</div>
</div>
<hr />
<div className="d-flex flex-column align-items-center">
<h1 className="display-3 my-3">Listed Products</h1>
<table className="table table-striped mb-5">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Product Name</th>
<th scope="col">Product Description</th>
<th scope="col">Product Price</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody>
{productList.map(product => (
<tr key={product._id}>
<th scope="row">{product._id}</th>
<td>{product.title}</td>
<td>{product.desc}</td>
<td>{product.prices[0]}</td>
<td>
<button className="btn btn-warning me-3" onClick={() => console.log("Test")}>Update</button>
<button className="btn btn-danger" onClick={() => handleDelete(product._id)}>Delete</button>
</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
)
}
export const getServerSideProps = async () => {
const productsList = await axios.get("http://localhost:3000/api/products")
return {
props: {
products: productsList.data
}
}
}
为了更好地衡量,这里还有 API 端点代码。
import dbConnect from "../../../lib/dbConnect"
import Product from "../../../models/Product"
export default async function handler(req, res) {
const { method, query:{ id} } = req
dbConnect()
if (method === "GET"){
try {
const product = await Product.findById(id)
res.status(200).json(product)
} catch (error) {
res.status(500).json(error)
}
}
if (method === "POST"){
try {
const product = await Product.create(req.body)
res.status(200).json(product)
} catch (error) {
res.status(500).json(error)
}
}
if (method === "DELETE"){
try {
await Product.findByIdAndDelete(id)
res.status(200).json("Product Deleted!")
} catch (error) {
res.status(500).json("Problem here")
}
}
}
所以经过一整夜的敲打我的脑袋,我弄清楚了问题出在哪里。在我的 handleDelete
函数中,以下行
const res = await axios.delete("http://localhost:3000/api/products/" + id)
将更改为:
const res = await axios.delete("http://internalIPhere:3000/api/products/" + id)
我的猜测是问题源于我 运行 我的虚拟机上的开发服务器并从主机 OS 访问它。由于 localhost
地址未在我的浏览器中解析,因此它无法到达 API 端点。我用虚拟机的 IP 替换 localhost
后,一切正常。