node里面koa ctx返回数据不使用return 无法返回

发布于 2022-09-12 02:33:17 字数 3246 浏览 20 评论 0

在自学node.js,使用的是koa
做到路由这个部分,发现一个关于promise的问题

连接数据库的代码:
mysql.js

const mysql = require('mysql')
const config = {
    database: "first_app",
    user: 'root',
    host: 'localhost',
    password: 'root',
    port: 3306
}

const pool = mysql.createPool(config)
function query(sql, params) {
    return new Promise((resolve, reject) => {
        pool.query(sql, params, (err, data) => {
            if (err) {
                reject(err)
            }
            resolve(data)
        })
    })

}
module.exports = query

后台操作代码
waresList.js

const query = require('../utils/mysql')

async function waresList(ctx) {
    let params = [ctx.params.id]
    let sql = `SELECT * FROM wares_type WHERE parent_id = ?`;
    let res = query(sql, params).then(data => {        
        console.log(2)
        ctx.body = data
    })
    console.log(1);
    return res
}


module.exports = waresList

最后是路由
router.js

const Router = require('koa-router')
const router = new Router({ prefix: '/api' })
let getWaresList = require('../wares/waresList')
router.get('/', ctx => {
    ctx.body = '<p>路由为:/</p>'
})

// 重点看这个
router.get('/getWaresList/:id', getWaresList) 

router.get('*', ctx => {
    ctx.body = '<h1>没有这个接口</h1>'
})

module.exports = router

出现了这样的现象
waresList.js中,如果我写了return res
那么可以正常返回结果
image.png
如果把return 去掉
image.png
最终都被执行了,但是却没有返回

换个写法,使用await的方式也同样有效果

// 依然会有返回结果
async function waresList(ctx) {
    let params = [ctx.params.id]
    let sql = `SELECT * FROM wares_type WHERE parent_id = ?`;
    let data = await query(sql, params)
    ctx.body = data
}

总结一下
两种情况和写法

// 这样是无效的
async function waresList(ctx) {
    let params = [ctx.params.id]
    let sql = `SELECT * FROM wares_type WHERE parent_id = ?`;
     query(sql, params).then(data => {
         console.log(2);
        ctx.body = data
     })
}

有效的三种写法

async function waresList(ctx) {
    let params = [ctx.params.id]
    let sql = `SELECT * FROM wares_type WHERE parent_id = ?`;
    let data = await query(sql, params)
    ctx.body = data
}
async function waresList(ctx) {
    let params = [ctx.params.id]
    let sql = `SELECT * FROM wares_type WHERE parent_id = ?`;
    let res = query(sql, params).then(data => {
        console.log(2);
        ctx.body = data
    })
    return res
}
async function waresList(ctx) {
    let params = [ctx.params.id]
    let sql = `SELECT * FROM wares_type WHERE parent_id = ?`;
     return query(sql, params).then(data => {
         console.log(2);
         ctx.body = data
     })
}

问题:

  1. 在无效写法中,then里面的方法依然被执行了,并且所有ctx是对的,不明白为什么无效
  2. return res中,依然先执行return,然后执行then,也就是说先返回了promise结果,是不是把then里的执行方法也给返回到外层函数执行了

对于promise还算了解,用的还挺多,但是这种情况真的是第一次见到,有没有朋友知道这是为什么

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冬天旳寂寞 2022-09-19 02:33:17

1.promise是异步,所以then是肯定会执行的。
2.你是想将promise的返回值给res,但是promise是异步操作,你执行return的时候,你还没有获取到数据,所以还没执行到then。koa框架接口返回的是ctx.body里面的值,所以你在then之后能获取到这个值。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文