首页 > 解决方案 > PUT 请求 404 未找到错误邮递员?Node.js 快递

问题描述

尝试发出 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;

标签: node.jsexpressmongoosepostman

解决方案


不要一起使用async/awaitand .then .catch,使用async/awaitwith 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()forfind和使用toObjectforfindOne或者findById您也可以尝试这样

let data = await House.findByIdAndUpdate({_id: req.params.id}, req.body)
res.status(200).json({data})

推荐阅读