老师我有一个问题在4-10中,不知道为什么我的代码先执行newBlog,在执行获取post的数据。

来源:5-10 开发路由(新建和更新博客路由)

qq_慕斯9403011

2020-07-02

第一个函数是app.js,我在getPostData写了一个console.log,在解析query写了一个console.log

const querystring = require('querystring')
const handleBlogRouter = require('./src/router/blog')
const handleUserRouter = require('./src/router/user')
const getPostData = (req) => {
    const promise = new Promise((resolve, reject) => {
        if (req.method !== 'POST') {
            resolve({})
            return
        }  
        if (req.headers['content-type'] !== 'application/json'){
            resolve({})
            return
        }
        let postData = ''
        req.on('data', chunk => {
            postData += chunk.toString()
        })
        req.on('end', () => {
            if (!postData) {
                resolve({})
                return
            }
            console.log("promise执行")//老师我在这里做了一个标记
            resolve(
                JSON.parse(postData)
            )
        })
    })
    return promise
}
const serverHandle = (req,res) => {
    //设置返回格式
    res.setHeader('Content-type','application/json')
    
    //获取path
    
    const url = req.url

    // path = url.split('?')[0]
    req.path = url.split('?')[0]

    //解析query
    req.query = querystring.parse(url.split('?')[1])
    getPostData(req).then(postData => {
        req.body = postData  
        console.log("req.body:" ,req.body)老师我在这里做了一个标记

    })
    //处理 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
    }

    // 未命中路由,返回 404
    res.writeHead(404, {'Content-type': 'text/plain'})
    res.write('404 Not Found\n')
    res.end()
}
module.exports = serverHandle

老师这是router中的blog.js,我在新建博客哪里输出了一个console.log

const { getList, getDetail, newBlog } = require('../controller//blog')
const { SuccessModel, ErrorModel} = require('../model/resModel')

const handleBlogRouter = (req, res)=>{
    const method = req.method
    

    //获取博客列表
    if (method === 'GET' && req.path === '/api/blog/list') {
        const author = req.query.author || ''
        const keyword = req.query.keyword || ''
        const listData = getList(author, keyword)
        return new SuccessModel(listData)
    }

    //获取博客详情
    if (method === 'GET' && req.path === '/api/blog/detail') {
        const id = req.query.id || ''
        const data = getDetail(id)
        return new SuccessModel(data)
    }

    //新建一篇博客
    if (method === 'POST' && req.path === '/api/blog/new') {
        console.log("在接口中",req.body)//我在这里做了一个标记
        const data = newBlog(req.body)
        return new SuccessModel(data)
    }

    //更新一篇博客
    if (method === 'POST' && req.path === '/api/blog/update') {
        return {
            msg: '这是更新博客的接口'
        }
    }

    //删除一篇博客
    if (method === 'POST' && req.path === '/api/blog/del') {
        return {
            msg: '这是删除博客的接口'
        }
    }

}
module.exports = handleBlogRouter

这个是controller中的blog.js

const getList = (author,keyword) => {
    return [
        {
            id: 1,
            title: '标题A',
            content: '内容A',
            createTime: 1593672088092,
            author: 'zhangsan'
        },
        {
            id: 2,
            title: '标题B',
            content: '内容B',
            createTime: 1593672088100,
            author: 'lisi'
        }
    ]
}
const getDetail = id => {
    return {
            id: 1,
            title: '标题A',
            content: '内容A',
            createTime: 1593672088092,
            author: 'zhangsan'
        }
}
const newBlog = (blogData = {}) => {
    console.log('blogData:', blogData)//输出post的数据信息
    return {
        id:3
    }
}
module.exports = {
    getList,
    getDetail,
    newBlog
}

执行结果截图:

这个正常

图片描述
这里明显先执行的newblog再执行的读取数据,不知道为什么?
图片描述

写回答

2回答

双越

2020-07-02

这么多代码,找问题是照不出来的。

我看到问题,大体猜测应该就是 promise 执行顺序的问题。

你能不能抛开这个项目环境,用一段最简单的代码,来复现这个问题?越简单越好。

0
2
双越
回复
qq_慕斯9403011
哈哈 没关系。我们开发过程中,经常遇到这种问题,自己怎么想也想不通。但是经过别人一句话的提示,哎?突然看到问题了。我曾经也遇到过这种问题。
2020-07-02
共2条回复

qq_慕斯9403011

提问者

2020-07-02

我知道错在哪了···,打扰老师了

1
0

Node.js+Express+Koa2+Nest.js 开发服务端

从入门到实战,一站式掌握 Node.js+Express+Koa2

4051 学习 · 2006 问题

查看课程