node里面koa ctx返回数据不使用return 无法返回
在自学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
那么可以正常返回结果
如果把return 去掉
最终都被执行了,但是却没有返回
换个写法,使用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
})
}
问题:
- 在无效写法中,then里面的方法依然被执行了,并且所有ctx是对的,不明白为什么无效
- return res中,依然先执行return,然后执行then,也就是说先返回了promise结果,是不是把then里的执行方法也给返回到外层函数执行了
对于promise还算了解,用的还挺多,但是这种情况真的是第一次见到,有没有朋友知道这是为什么
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
1.promise是异步,所以then是肯定会执行的。
2.你是想将promise的返回值给res,但是promise是异步操作,你执行return的时候,你还没有获取到数据,所以还没执行到then。koa框架接口返回的是ctx.body里面的值,所以你在then之后能获取到这个值。