gpt4 book ai didi

javascript - 使用 async/await 时 try/catch 中的范围问题

转载 作者:行者123 更新时间:2023-11-30 19:10:31 25 4
gpt4 key购买 nike

我的问题是,当我在下面的函数中输入 catch block 时,(似乎)事情超出了范围,或者范围被污染了:

export const getOne = model => async (req, res, next) => {
let id = req.params.id
let userId = req.user
try {
let item = await model.findOne({ _id: id, createdBy: userId }).exec()
if (!item) {
throw new Error('Item not found!')
} else {
res.status(200).json({ data: item }) // works perfectly
}
} catch (e) {
res.status(400).json({ error: e }) // TypeError: res.status(...).json is not a function
// also TypeError: next is not a function
// next(e)
}
}

有趣的是,在 catch block 中使用 res.status(...).end() 工作得很好,但令我困扰的是我不能将任何详细信息与响应一起发回。根据 res.send() 的快速文档和 res.json我应该能够链接 .status(),同样有趣的是,如果事情成功的话,它在上面的 try 语句中工作得很好 - res .status(200).json(...) 完美运行。

此外,我尝试将错误处理抽象为中间件,as suggested on the Express documentation ,并且通过闭包,我仍然可以访问 catch 语句中的 next,对吧?为什么返回不是函数?

  1. 为什么 res.status(...).json(...) 在我的 try block 中有效,但在 catch block 中无效?
  2. 为什么 next 不再是 catch block 中的函数?

提前致谢!

编辑

这在单元测试中失败,以下代码产生上述错误:

describe('getOne', async () => {
// this test passes
test('finds by authenticated user and id', async () => {
expect.assertions(2)

const user = mongoose.Types.ObjectId()
const list = await List.create({ name: 'list', createdBy: user })

const req = {
params: {
id: list._id
},
user: {
_id: user
}
}

const res = {
status(status) {
expect(status).toBe(200)
return this
},
json(result) {
expect(result.data._id.toString()).toBe(list._id.toString())
}
}

await getOne(List)(req, res)
})
// this test fails
test('400 if no doc was found', async () => {
expect.assertions(2)

const user = mongoose.Types.ObjectId()

const req = {
params: {
id: mongoose.Types.ObjectId()
},
user: {
_id: user
}
}

const res = {
status(status) {
expect(status).toBe(400)
return this
},
end() {
expect(true).toBe(true)
}
}

await getOne(List)(req, res)
})
})

最佳答案

Why does res.status(...).json(...) work in my try but not catch block?

似乎您在使用单元测试运行时传递了一个只有 statusend 方法的非表达对象。这就是它找不到 json 方法的原因

关于javascript - 使用 async/await 时 try/catch 中的范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58531622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com