带有异步/等待和快速路由的 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.js
:app.use((err, req, res, next) => console.log(err); res.send(err); )
以上是关于带有异步/等待和快速路由的 TypeError的主要内容,如果未能解决你的问题,请参考以下文章