V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  lingo9  ›  全部回复第 1 页 / 共 1 页
回复总数  9
334 天前
回复了 flypei 创建的主题 推广 元旦 T 楼! 送 Google One 2T + 京东 E 卡 300 元
元旦快乐!
2023-05-14 16:55:56 +08:00
回复了 lingo9 创建的主题 Node.js 初学 nodejs 的框架 koa,遇到一个问题解决不了,关于 await next()
@DeWjjj 谢谢大佬,我去了解一下 Node.js 中的锁和数据竞争
2023-05-14 16:50:09 +08:00
回复了 lingo9 创建的主题 Node.js 初学 nodejs 的框架 koa,遇到一个问题解决不了,关于 await next()
@ucun 刚开始学习 nodejs, 所以先从 express 和 koa 开始了,后面是打算学 nestjs
2023-05-14 16:48:20 +08:00
回复了 lingo9 创建的主题 Node.js 初学 nodejs 的框架 koa,遇到一个问题解决不了,关于 await next()
@Nazz 我大概能理解一点 koa 的洋葱模型,相比于 express 都是通过递归调用,不过 koa 的中间件函数执行会返回一个 Promise, 然后可以通过 async await 等待异步函数的执行
2023-05-14 16:38:04 +08:00
回复了 lingo9 创建的主题 Node.js 初学 nodejs 的框架 koa,遇到一个问题解决不了,关于 await next()
@zbinlin 感谢大佬的解答,我向 ChatGPT 询问了事件循环的阶段
1. Timers 阶段:处理定时器相关的回调函数,例如 setTimeout() 和 setInterval() 的回调。
2. Pending I/O 阶段:处理某些系统操作的回调函数,例如网络请求、文件 I/O 等待的回调。
Idle, Prepare 阶段:内部使用,忽略。
3. Poll 阶段:处理除了定时器和 I/O 之外的回调函数。在这个阶段,Node.js 会检查是否有新的 I/O 事件、计时器到期或者进入了一些回调函数的 setImmediate()。
4. Check 阶段:处理通过 setImmediate() 注册的回调函数。
5. Close Callbacks 阶段:处理通过 close 事件注册的回调函数,例如关闭的文件描述符或者套接字的回调。
然后尝试了,在 `/users/:id` 重现错误
router.get("/users/:id", (ctx) => {
const id = ctx.request.params.id;

Promise.resolve().then(() => {
ctx.body = id;
});

setTimeout(() => {
ctx.body = id;
}, 1000);

process.nextTick(() => {
ctx.body = id;
});
// ctx.body = id;
});
我现在的理解是,我的代码中, authMiddleware 中间件,因为同步执行,没有等待 next() 函数的结果,也就是不能获取到
` /upload ` 中间件中的 `ctx.body = "upload"`, 在 koa 源码中,进入了 `catch` 返回 404 Not Found
```js
handleRequest(ctx, fnMiddleware) {
const res = ctx.res;
res.statusCode = 404; // 修改为 401
const onerror = err => ctx.onerror(err);
const handleResponse = () => respond(ctx);
onFinished(res, onerror);
return fnMiddleware(ctx).then(handleResponse).catch(onerror);
}
```
在修改了 `res.statusCode = 401` 后, 确实也能在客户端接收到 401 的错误, 根据 koa 的源码,响应结果会在所有中间件执行完毕后,在 then 中执行回调,所以 setImmediate, setTimeout 会在响应之后执行,无法实现对 ctx.body 赋值,完成响应.
不知道我的理解是否正确, 现在疑惑的是, nextTick 为什么没在 then 中注册的回调函数之前执行呢?
2023-05-13 23:45:04 +08:00
回复了 lingo9 创建的主题 Node.js 初学 nodejs 的框架 koa,遇到一个问题解决不了,关于 await next()
@a632079 感谢大佬的解答,我可能还需要在捋一捋 nodejs 的事件循环.
2023-05-13 23:10:07 +08:00
回复了 lingo9 创建的主题 Node.js 初学 nodejs 的框架 koa,遇到一个问题解决不了,关于 await next()
@a632079 谢谢大佬的解答,我好像能模糊的理解一点点,因为 next 函数将中间件函数放入了微任务队列中,而 authMiddleware 是同步执行, 并且没有等待 next 函数的执行结果,直接返回客户端响应导致 404 Not Found.我没理解的是为什么 /users/:id 接口能正确响应?这也应该在微任务队列中吧?
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2621 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 14ms · UTC 06:56 · PVG 14:56 · LAX 22:56 · JFK 01:56
Developed with CodeLauncher
♥ Do have faith in what you're doing.