请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

POST发出后无法进入req.on('data')中

const handleBlogRouter = require('./src/router/blog')
const handleUserRouter = require('./src/router/user')
const querystring = require('querystring')
const serverHandle = (req, res) => {
  //获取path
  const url = req.url
  req.path = url.split('?')[0]
  req.query = querystring.parse(url.split('?')[1])
  const getPostData = (req) => {
    const promise = new Promise((resolve, reject) => {
      if (req.method === 'POST' && req.headers['content-type'] === 'application/json') {
        let postData = ''
        req.on('data', (trunk) => {
	        //这里没有进去
          console.log('get some data')
          postData += trunk.toString()
        })
        req.on('end', () => {
          if (!postData) {
            resolve({})
            return
          }
          //将postData转化为对象格式
          resolve(JSON.parse(postData))
        })
      }
      else {
        resolve({})
      }
    })
    return promise
  }

  // 设置返回格式为 JSON
  res.setHeader('Content-type', 'application/json')

  getPostData(req)
    .then(postData => {
      //将postdata放入req
      req._body = postData
    })

  //处理blog路由
  const blogData = handleBlogRouter(req, res)
  if (blogData) {
    res.end(
      JSON.stringify(blogData)
    )
    return
  }
  //处理user路由
  const userData = handleUserRouter(req, res)
  if (userData) {
    res.end(
      JSON.stringify(userData)
    )
    return
  }

  res.writeHead(404, { 'Content-type': 'text/plain' })
  res.write('404 NOT FOUND')
  res.end()

}
module.exports = serverHandle

图片描述

POST请求

补充:
图片描述

我把处理基本上都注释掉之后发现运行的顺序出了问题

正在回答 回答被采纳积分+3

3回答

双越 2020-02-11 09:05:18

暂时没看出啥问题。这样吧,你把你的代码简化一下,只要 req.on('data') 和 req.on('end') ,其他的什么都不要,简化到最简单,能少一行就别多一行。

这样再试试,如果还是不行,我再帮你调试一下。

0 回复 有任何疑惑可以回复我~
  • 提问者 kagura_kana #1
    评论好像放不了gif,图片在问题中以补充。
    我把处理基本上都注释掉之后发现运行的顺序出了问题
    进入req .on('data')之后好像被停住了,然后它先去处理路由(handleUserRouter( ))了,导致req.body还没有被赋值就被取值了,然后才进入到了req.on('data'),很奇怪
    回复 有任何疑惑可以回复我~ 2020-02-11 12:37:29
  • 双越 回复 提问者 kagura_kana #2
    哦,这个现象是因为 getPosetData 是异步的。你代码中,没等异步执行完,就去处理路由了。
    回复 有任何疑惑可以回复我~ 2020-02-11 12:46:25
  • 提问者 kagura_kana #3
    然后我把
    const userData = handleUserRouter(req, res)
    放到  .then( ) 里面之后就可以赋值到req.body了
    回复 有任何疑惑可以回复我~ 2020-02-11 12:47:35
提问者 kagura_kana 2020-02-10 22:53:44

https://img1.sycdn.imooc.com//szimg/5e416e5f0915c76e07690399.jpg

是appliciation/json

0 回复 有任何疑惑可以回复我~
双越 2020-02-10 22:44:04

在 getPostData 中,首先打印一下 req.headers['content-type'] 是啥?

0 回复 有任何疑惑可以回复我~
  • 提问者 kagura_kana #1
    是appliciation/json
    回复 有任何疑惑可以回复我~ 2020-02-10 22:54:31
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信