簡體   English   中英

NodeJS + Express:服務器無法解析 GET、PUT、POST 或 DELETE 請求(狀態 404)

[英]NodeJS + Express: Server cannot resolve GET, PUT, POST, or DELETE requests (Status 404)

server.js

const express = require('express')
const dotenv = require('dotenv').config()
const port = process.env.PORT ||9999
const goals = require('./routes/goalRoutes')
const app = express()

app.use('/api/goals', goals)
app.listen(port, () => console.log(`Server started on port ${port}`))

goalRoutes.js定義了一個路由api/goals

const express = require('express')
const router = express.Router()
const { createGoal, getGoals, updateGoal, deleteGoal, } = require('../controllers/goalController')

router.route('/').post(createGoal).get(getGoals)
router.route('/:id').put(updateGoal).delete(deleteGoal)

module.exports = router

goalController.js為該路由提供功能

//@desc     Create goal
//@route    POST /api/goals
//@access Private
const createGoal = (err, req, res, next) => {
    res.status(200).json({message: "Create goal"})
}

//@desc     Get goals
//@route    GET /api/goals
//@access Private
const getGoals = (err, req, res, next) => {
    res.status(200).json({message: "Read goals"})
}

//@desc     Update goal
//@route    PUT /api/goals:id
//@access Private
const updateGoal = (err, req, res, next) => {
    res.status(200).json({message: `Update this goal: ${req.params.id}`})
}

//@desc     Get goals
//@route    DELETE /api/goal/:id
//@access Private
const deleteGoal = (err, req, res, next) => {
    res.status(200).json({message: `Delete this goal: ${req.params.id}`})
}

module.exports = {
    createGoal,
    getGoals,
    updateGoal,
    deleteGoal,
}

我已經為該路由創建了一個路由(意圖為/api/goals )和控制器。 然后,我使用在goalController.js中找到的控制器來處理 GET、PUT、POST 和 DELETE 請求,並將其連接到goalRoutes.js

使用 Postman 進行測試,我只能以 404 狀態解析這些請求。

我最初的想法是我沒有正確地將控制器函數導入到goalRoutes.js中,但我似乎已經將它們導出為對象就好了,而且 Node 在運行時似乎沒有任何問題。

我曾經在router.getrouter.postrouter.putrouter.delete的回調函數中擁有控制器函數的主體,但這真的很混亂。 我強烈希望不要回到那個爛攤子。

我很茫然。 是什么阻止router.route的回調函數使用控制器函數? 為什么郵遞員會收到 404?

如果我的術語很糟糕,我深表歉意。 我是 Javascript 的初學者。

您已將所有控制器注冊為錯誤處理中間件

以與其他中間件函數相同的方式定義錯誤處理中間件函數,除了錯誤處理函數有四個參數而不是三個: (err, req, res, next)

從每個參數中刪除第一個err參數

const createGoal = (req, res, next) => {
  res.json({message: "Create goal"})
}

const getGoals = (req, res, next) => {
  res.json({message: "Read goals"})
}

const updateGoal = (req, res, next) => {
  res.json({message: `Update this goal: ${req.params.id}`})
}

const deleteGoal = (req, res, next) => {
  res.json({message: `Delete this goal: ${req.params.id}`})
}

僅供參考,使用res.json()時的默認響應狀態為 200。

你必須在goalRoutes.js 文件中嘗試這個

router.use('/').post(createGoal).get(getGoals)
router.use('/:id').put(updateGoal).delete(deleteGoal)

如果您使用 nodejs 模塊導入,請嘗試將其實現到您的代碼中,它可以工作

export default ()=> {
    const app = Router()

    RolesRoute(app)
    auth(app)
    FlightRoute(app)
    MaintenanceRoute(app)
    Books(app)

    app.use('/user',UserRoute())

    app.use('/engineer', EngineerRoute())
    app.use('/instructor', InstructorRoute())

    return app
}

認證路由



import { Router } from 'express'

import {AuthValidator} from "../../../lib/validator";
import AuthController from "../../../controllers/auth.controller";
import {isAdmin, isAuth} from "../../../lib/middleware/auth";

const route = Router();
export default (app)=> {
    app.use('/auth', route);

    /**
     * Sign in
     */
    route.post("/signIn", AuthValidator.signInValidator, AuthController.signIn)

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM