当前位置: 首页 > 知识库问答 >
问题:

请求。在express应用程序的post route中未定义正文

阴焱
2023-03-14

这是我的路由器

router.post('/', async(req, res) => {

const posts = await loadPostsCollection()

await posts.insertOne({
    text: req.body.text,
    createdAt: new Date()
})
res.status(201).send()
})

这是终端错误

正在端口3090上侦听。。。。。(节点:7764)未经处理的PromisejectionWarning:TypeError:无法读取/Users/macbook/Desktop/node project/server/routes/api/posts上未定义的属性“text”。js:19:24在ProcessTicks和Rejections(internal/process/task_queues.js:94:5)(节点:7764)未处理Promisejection警告:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。(拒绝id:1)(节点:7764)[DEP0018]弃用警告:未处理的promise拒绝已弃用。将来,未处理的promise拒绝将终止节点。具有非零退出代码的js进程。

共有1个答案

刘成礼
2023-03-14

这是因为您的req.body将产生值未定义的。因此,当您尝试执行req.body.text时,当您试图访问未定义的值上的text属性时,会出现错误。

之所以会出现未定义的,是因为您的Express应用无法解析请求主体。

为此,您需要安装主体解析器中间件依赖项,

npmi主体解析器

然后将此中间件添加到您的express应用程序,

const bodyParser = require('body-parser')
app.use(bodyParser.json())

参考:https://expressjs.com/en/resources/middleware/body-parser.html

这里是一个示例应用程序,

const express = require('express')
const app = express()
const bodyParser = require('body-parser')
app.use(bodyParser.json())

app.post('/', (req, res) => {
    return res.send(`Hello ${req.body.name}!`)
})

app.listen(3000, () =>
    console.log(`Example app listening at http://localhost:${port}`)
)

现在,如果您使用curl调用上述示例应用程序,

curl -XPOST localhost:3000 -H "Content-Type: application/json" -d '{"name":"Ram"}'

你会得到回应“你好,拉姆!”

 类似资料:
  • 我正在编写一个简单的Express应用程序来处理图像上传和搜索。上传工作正常,但相同的req.user._id在get请求中无效。知道为什么吗? post函数使用Multer中间件可以很好地工作。它使用req.user._id时没有任何问题--我已经检查了它是否上传到了数据库。 在我测试了一个返回以下错误的get函数后,立即返回了以下错误:TypeError:无法读取未定义的属性'_id'

  • 我正在使用分离的存储库(后端)进行MERN堆栈项目 但是,当我切换到生产环境并将代理值替换为部署的链接时,“代理”不再受支持。我做了一个关于它的搜索,我发现它只是为了开发环境,我尝试了在互联网上找到的几个解决方案,但没有运气! 顺便说一下,我用Heroku部署后端,用Netlify部署前端。现在,它们都部署好了,没有任何错误,但是后端和前端之间没有连接。

  • 编辑:我在这里不问任何关于cors的问题 所以我花了几个小时试图弄清楚发生了什么,嗯...我失去了它... 所以我有一个简单的应用程序,服务器部分用nodejs制作,前端用react制作,它们运行在不同的端口上,所以我使用了cors模块。 而res2是未定义的。 我错过了什么?

  • 我希望我的REST API在存在异常和参数类型不匹配时抛出异常。以下是我的请求对象。 在上面的情况下,当一个请求违反这个字符串要求时,应该引发异常(向订阅类型提供一个整数值)。我还需要对无效字符进行验证,如*、-、 我的控制器看起来像这样。 我正在使用@Valid注释,并且我已经包含了Hibernate验证器的maven依赖项 但问题是,它不验证我的输入,也不接受订阅类型和caseId的整数值。

  • 我尝试了拉雷维尔的入门指南。通用域名格式。 有一章创建了任务。回调和函数

  • 问题内容: 我注意到,几乎所有Express.js应用程序示例都使用端口3000作为HTTP服务器的默认侦听端口。这仅仅是因为它是一个很少使用的端口,还是该端口号有其他原因吗? 如果要在本地计算机上并行运行多个应用程序,使用3000、3001、3002等端口是否是一种好习惯? (我理解,理想情况下,您应该让系统分配端口。出于简单起见,这只是一个问题,为什么3000似乎是常规分配。) 问题答案: 选