PUT 请求 404 未找到错误邮递员? Node.js 快递
Posted
技术标签:
【中文标题】PUT 请求 404 未找到错误邮递员? Node.js 快递【英文标题】:PUT request 404 not found error Postman? Node.js Express 【发布时间】:2021-05-12 08:28:24 【问题描述】:尝试发出 PUT 请求以更新我的 MERN 应用程序的房屋时。该路由似乎在服务器端不起作用,在邮递员中它显示 404 not found 错误。我猜测这可能是我的路线设置方式,因为它甚至无法识别我正在尝试发出 PUT 请求。我的所有其他路线都有效,但由于某种原因,我在邮递员中收到 index.html 错误。 PUT 请求位于 HouseList Route 代码的底部。
房屋清单路线
// const express = require('express')
// const router = express.Router()
const router = require('express').Router();
const House = require('../../Models/House');
const Formidable = require('formidable');
const cloudinary = require('cloudinary').v2
const mongoose = require('mongoose');
require("dotenv").config()
// const request, response = require('express');
// const dotenv = require("dotenv");
// dotenv.config();
//mongoDB and Cloudinary
const mongoURI = process.env.Mongo_URI;
cloudinary.config(
cloud_name: process.env.CLOUD_NAME,
api_key: process.env.API_KEY,
api_secret: process.env.API_SECRET
)
mongoose.connect(mongoURI, useNewUrlParser:true, useUnifiedTopology:true, (error)=>
if(error)
return console.log(error)
return console.log("database is connected")
)
router.post("/api/house-listing", async (request, response)=>
const form = new Formidable.IncomingForm();
form.parse(request, (error, fields, files)=>
const
price,
city,
county,
numOfBeds,
numOfBaths,
numOfGarages,
isSaleOrRent,
us_state,
squarefeet
= fields
const house_image = files;
console.log('Price: ', price)
console.log('City: ', city)
console.log('county: ', county)
console.log('state: ', us_state)
console.log('squarefeet', squarefeet)
console.log('numOfGarages: ', numOfGarages)
console.log('numOfBeds: ', numOfBeds)
console.log('numOfBaths: ', numOfBaths)
console.log('isSaleOrRent: ', isSaleOrRent)
console.log('houseImage', house_image.path)
cloudinary.uploader.upload( house_image.path,
folder:"/houseAgency/houses", async(error, result)=>
if(error)
console.log(error)
const image_url = result.url;
const newHouse = new House(
house_location:
county: county,
city: city,
us_state: us_state
,
house_details:
price: price,
squarefeet: squarefeet,
numOfBeds: numOfBeds,
numOfBaths: numOfBaths,
numOfGarages: numOfGarages,
isSaleOrRent: isSaleOrRent,
house_image: image_url,
)
const savedHouse = await newHouse.save();
return response.status(200).json(savedHouse)
)
)
)
router.put('/api/house-details/:id', (req, res) =>
House.findByIdAndUpdate(_id: req.params.id, req.body).exec().then((data)=>
console.log(req.body)
if (data === null)
return res.status(404).json( errors: [location: "house-details", msg: "Not found", param: req.params.id])
return res.status(200).json(data)
).catch((error)=>
return res.status(500).json("error": error)
)
);
module.exports = router;
找房子
// const express= require('express')
// const router = express.Router()
const router = require('express').Router();
const House = require('../../Models/House');
//HOUSE Fetch
router.get('/api/house-sale', async(req, res)=>
try
House.find('house_details.isSaleOrRent': 'SALE').exec().then((data)=>
// console.log(data);
return res.status(200).json(data)
)
catch(error)
return res.status(500).json(msg: 'server is currently Down :(')
)
router.get('/api/house-rent', async(req, res)=>
try
House.find('house_details.isSaleOrRent': 'RENT').exec().then((data)=>
return res.status(200).json(data)
)
catch(error)
return res.status(500).json(msg: 'server is currently Down :(')
)
router.get('/api/house-details/:id', async(req, res)=>
await House.findOne(_id:req.params.id).exec().then(data=>
return res.status(200).json(data)
).catch(error =>
return res.status(400).json(error)
)
)
router.get("/api/house-search/:query", async (request, response) =>
const us_states = [
"Alabama", "Alaska", "American Samoa", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "District of Columbia", "Florida", "Georgia", "Guam", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Minor Outlying Islands", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Northern Mariana Islands", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Puerto Rico", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "U.S. Virgin Islands", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"
];
const query = request.params.query;
const result = [];
for (let counter = 0; counter < us_states.length; counter++)
let currentStates = us_states[counter];
if (query.toLowerCase().includes(currentStates.toLowerCase()))
result.push(currentStates);
House.find( "house_location.us_state": result[0] )
.exec()
.then((data) =>
return response.status(200).json(data);
)
.catch((error) =>
console.log(error);
);
);
module.exports = router;
【问题讨论】:
您是否错过了路线中的/api
部分? /api/house-details/:id
我是,但它没有解决问题。
House.findByIdAndUpdate 期间出现任何错误都会得到 404,更新数据的主体是否与猫鼬模式模型匹配?尝试记录正文错误,并将正文与您的架构进行比较。
该请求现在给了我一个 200 状态码,但实际上没有任何数据更新。我试图记录身体。但看起来我没有收到任何数据。
【参考方案1】:
您正在尝试执行放置在路由中的方法,但您尚未在代码中声明它。
在您的问题中,您没有提及您尝试访问的路线。我想你想做一个投入路线/api/house-details/:id
。
为了实现这一点,您应该使用put 方法声明一个新路由,在放置路由声明后您应该编写您的路由处理程序:
router.put('/api/house-details/:id', (req, res) =>
const options = new: true ;
House.findByIdAndUpdate(req.params.id, req.body, options).exec().then((data)=>
console.log(req.body)
if (data.value === null)
return res.status(404).json( errors: [location: "house-details", msg: "Not found", param: req.params.id])
return res.status(200).json(data)
).catch((error)=>
return res.status(500).json("error": error)
)
);
要返回修改后的修改集合项(更新后),您必须包含options: new: true
,如documentation 所述。
【讨论】:
那是我的错误,我在帖子的编辑中添加了新代码,但在复制和粘贴时忘记包含路线。但是我尝试了你的建议,当我得到一个 200 状态代码时,身体并没有更新邮递员中的数据。为什么会发生这种情况? 只需在函数findByIdAndUpdate
中添加:new: true
作为参数,它将返回修改后的元素。
好的,所以我尝试添加这段新代码,但它仍然只返回没有更新值的旧正文。
你能检查一下这个值是否在 mongodb shell 中用新值更新了吗?
mongo shell 中的值没有更新。它记录更改值的主体,但实际上并没有更改值【参考方案2】:
不要同时使用async/await
和.then .catch
,使用async/await
和try/catch
,使用res
时不需要返回,所以你应该像这样更新所有查询:
try
let data = await House.findByIdAndUpdate(_id: req.params.id, req.body).toObject()
res.status(200).json(data)
catch (error)
res.status(404).json("error": error)
如果您希望 find 的结果是一个普通对象 javascript,您可以使用 lean()
表示 find
并使用 toObject
表示 findOne
或 findById
也可以这样尝试
let data = await House.findByIdAndUpdate(_id: req.params.id, req.body)
res.status(200).json(data)
【讨论】:
以上是关于PUT 请求 404 未找到错误邮递员? Node.js 快递的主要内容,如果未能解决你的问题,请参考以下文章
来自 PUT 的 Azure Blob 存储文档中的“404 资源未找到”
错误状态:使用 Node.js (express)、Angular 和 MongoDB 的 PUT 请求返回 404