javascript - 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"
}
}
解决方案
路由是按顺序处理的,因此如果您希望 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
仍然没有填充正文内容。
推荐阅读
- regex - 通过用括号括起来使区号(电话号码的前 3 位)突出来打印电话号码的命令
- reactjs - 创建 React Elements 的引用并像变量一样使用它
- c++ - 如何以有效的方式从函数返回值?(c++)
- python - 根据条件从当前行和上一行中的值创建列表
- arrays - RESB:声明和填充未初始化的数据
- python - opencv python错误:断言失败:size.width>0&&size.height>0
- python - 当 Cron 执行 selenium 时,geckodriver 的路径是什么
- c++ - 将二叉树的高度计算为 void 函数
- unity3d - 为什么在 Unity 车轮对撞机上侧向轮胎打滑与前向打滑分开?
- html - 如何将 div 扩展到某个高度,并且仅在该滚动之后?