You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express.js中如何异步使用app.get及正确编写回调函数?

问题修复方案

你遇到的两个报错对应异步写法的两个常见问题,修复方式如下:

1. await语法报错的修复

await关键字只能在被async标记的函数内部使用,你之前的路由处理函数是普通函数,直接写await就会触发语法错误。
如果你的guiText是返回Promise的异步函数(新版sqlite驱动默认支持Promise风格调用),直接给路由回调加async标记即可正常使用:

app.get('/', async (req, res) => {
  const gui = await guiText("index", lang);
  res.render("index", {gui: gui});
  console.log ("sent gui", gui)
})

2. 回调写法报错的修复

你之前的回调写法有两个明确错误:

  • res是路由回调接收的、当前请求独有的响应对象,不是挂载在app全局下的属性,写app.res.render本身就会因为找不到app.res触发报错
  • 直接把对象方法当参数传递时,方法内部的this上下文会丢失,就算你拿到了res.render方法,直接传进去执行时也会因为内部this指向不对报错

正确的回调写法如下,先用箭头函数包裹一层render调用,既保证上下文正确,也能匹配你guiText的回调参数规则:

// guiText保持你修改后的三参数结构即可,内部查询完sqlite调用myCallback("index", {gui: result})
app.get('/', (req, res) => {
  guiText("index", lang, (tpl, data) => {
    res.render(tpl, data);
    console.log("sent gui", data.gui)
  })
})

如果想直接传递render方法,也可以手动绑定res上下文,这种写法可读性差,不推荐:

guiText("index", lang, res.render.bind(res, "index"))

内容的提问来源于stack exchange,提问作者Alain Bertrand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 14:57:29