带有异步/等待和快速路由的 TypeError

Posted

技术标签:

【中文标题】带有异步/等待和快速路由的 TypeError【英文标题】:TypeError with async/await and express routing 【发布时间】:2018-09-09 21:56:56 【问题描述】:

这里的相对初学者,我遇到了 express 和 async/await 函数的问题,以及未处理的 Promise 拒绝。

这是我在客户端的代码,从页面中获取用户名和密码并将其发送过来。

async function signIn() 
    let username = document.getElementById('username').value
    let password = document.getElementById('password').value

    let url = '/api/login'
    url += '?username=' + username
    url += '&password=' + password

    const response = await fetch(url)
    console.log(response)

这是我对应的服务器函数:

app.post('/api/login', function (req, res) 
    console.log("I'll log you in")

在那之后有一些代码确实会登录,但这就是我创建我遇到的错误所需要的全部内容。

这是我在 safari 11.03 中遇到的错误:

Unhandled Promise Rejection: TypeError: Type error

这是 Firefox 59.0.1 中的错误:

TypeError: NetworkError when attempting to fetch resource.

我希望有人可以在这里帮助我。

谢谢。

【问题讨论】:

您的fetch 是否返回了 Promise?它应该让await 工作developer.mozilla.org/en-US/docs/Web/javascript/Reference/… 您正在使用您的快速代码定义“POST”方法,但我猜fetch 默认使用“GET”。也许尝试将app.post(... 更改为app.get(... 看看是否有结果。您是否在服务器日志中看到控制台“我会让您登录”? 无论我使用 app.get 还是 app.post,我都会得到相同的结果,而且我没有在我的服务器日志上看到“我会让你登录”???? 【参考方案1】:

为了处理承诺拒绝,您可以在const response = await stuff 周围放置一个try/catch 块:

let response;
try 
  response = await fetch(url)
catch(err) 
  // do stuff with error

(如果你想要一个差异格式:how use const in try catch block)

至于错误本身,你还知道什么吗?您可以分享更多代码或服务器的错误消息吗?让我知道,当您发布更新的信息时,我会编辑此答案。

【讨论】:

好吧,当我将 app.post('/api/login', function (req, res) console.log("I'll log you in") 替换为 app.post('/api/login', function (err) if (err) console.error(err) pastebin.com/a6yPAwHf 时会发生什么(警告,800 行长) 其余的代码并没有改变任何东西——即使我完全删除了它,但如果你想试一试,我会给你一个 github 链接。 当然,那会很有帮助 啊哈。如果你想在你的路由中添加一个错误处理程序,它有四个参数err, req, res, next。您记录的是整个请求对象。将此添加到您的路线上方的app.jsapp.use((err, req, res, next) => console.log(err); res.send(err); )

以上是关于带有异步/等待和快速路由的 TypeError的主要内容,如果未能解决你的问题,请参考以下文章

带有异步和等待的箭头函数在本机反应中

快速错误处理和异步等待

使用异步等待自动尝试捕获路由器控制器

带有请求承诺的异步/等待返回未定义

React-Router:如何在路由转换之前等待异步操作

如何使用异步数据库写入进行快速重定向?