首页 > 解决方案 > Express Router.Post 没有在 Postman 上发回 Json

问题描述

我正在尝试学习快递以及如何使用邮递员,并且正在学习教程。一切都很顺利,直到我通过向服务器发送虚拟数据来测试 router.get。我使用邮递员尝试发布到我的本地主机 500。我没有得到我发送的数据的 json,而是得到 200 状态,并且屏幕底部没有任何内容。当我在点击该路由时检查控制台时,这将记录到控制台:http://undefined/api/members

请注意,我使用 router.get 来接收我所有成员的 json 没有问题,并且我可以通过仅使用成员 ID 搜索来接收 json。但无论出于何种原因 router.post 对我不起作用。我怀疑这与正文解析器有关。但我不确定为什么具体它不起作用。请帮忙。

这就是我设置我的应用程序文件的方式:

const express = require('express')
    const app = express()
    const path = require('path');
    const logger = require('./middleware/logger')
    const bodyParser = require('body-parser')



    app.use(logger)

    app.use('/api/members', require('./routes/api/members'))

    app.use(bodyParser.json())

    app.use(bodyParser.urlencoded({extended: false}))

    app.use(express.static(path.join(__dirname, 'public')))



    const PORT = process.env.PORT || 5000
    app.listen(PORT, () => {
        console.log(`Server started on port ${[PORT]}`)
    })

以下是我设置路由器文件的方式

const express = require('express')
const router = express.Router()
const members = require('../../Members')


router.get('/', (req, res) =>{
    res.json(members);
})


router.get('/:id', (req, res) => {
    const found = members.some(member => member.id === parseInt(req.params.id));

    if(found){
    res.json(members.filter(member => member.id === parseInt(req.params.id)))
    } else { 
        res.status(400).json({msg: `No member with the id of ${req.params.id}`})
    }
})


router.post('/', (req, res) => {
    res.send(req.body)
})



module.exports = router 

我的 package.json:

{
  "name": "expressCrashCourse",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index",
    "dev": "nodemon index"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.19.0",
    "express": "^4.17.1",
    "moment": "^2.24.0"
  },
  "devDependencies": {
    "nodemon": "^2.0.2"
  }
}

标签: javascriptapiexpresspostmanrouter

解决方案


路由是按顺序处理的,因此如果您希望 body-parser 中间件对您的.post()路由处于活动状态,则中间件必须在它之前。所以,改变这个:

app.use('/api/members', require('./routes/api/members'))

app.use(bodyParser.json())

app.use(bodyParser.urlencoded({extended: false}))

对此:

app.use(bodyParser.json())

app.use(bodyParser.urlencoded({extended: false}))

app.use('/api/members', require('./routes/api/members'))   // <== after your middleware

实际上,它在中间件有机会运行之前就已经到达您的路线,因此req.body仍然没有填充正文内容。


推荐阅读