PUT 请求 404 not found 错误邮递员? Node.js Express

时间:2021-02-08 17:41:31

标签: node.js express mongoose postman

尝试发出 PUT 请求以更新我的 MERN 应用程序的房屋时。该路由似乎在服务器端不起作用,在邮递员中它显示 404 not found 错误。我猜测这可能是我设置路由的方式,因为它甚至无法识别我正在尝试发出 PUT 请求。我的所有其他路线都有效,但由于某种原因,我在邮递员中收到了 index.html 错误。 PUT 请求位于 HouseList 路由代码的底部。

HouseList 路线

// 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;

HouseFetch

// 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;

2 个答案:

答案 0 :(得分:0)

不要将async/await.then .catch一起使用,将async/awaittry/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 用于 findOnefindById 您也可以试试这个

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

答案 1 :(得分:0)

您正在尝试执行放置在路由中的方法,但您尚未在代码中声明它。 在您的问题中,您没有提到您尝试访问的路线。我想您想在路线 /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 所述。

相关问题