我使用的是 nodejs 8。我已经将 promise 结构代码替换为使用 async 和 await。
当我需要返回一个对象但 await sentence resolve undefined 时遇到问题。
这是我的 Controller 方法:
request.create = async (id, params) => {
try {
let request = await new Request(Object.assign(params, { property : id })).save()
if ('_id' in request) {
Property.findById(id).then( async (property) => {
property.requests.push(request._id)
await property.save()
let response = {
status: 200,
message: lang.__('general.success.created','Request')
}
return Promise.resolve(response)
})
}
}
catch (err) {
let response = {
status: 400,
message: lang.__('general.error.fatalError')
}
return Promise.reject(response)
}
}
在http请求函数中:
exports.create = async (req, res) => {
try {
let response = await Request.create(req.params.id, req.body)
console.log(response)
res.send(response)
}
catch (err) {
res.status(err.status).send(err)
}
}
我尝试用 then
和 catch
返回 Promise.resolve(response)
和 Promise.reject(response)
> 在中间件函数中发生相同。
怎么了?
非常感谢,干杯
最佳答案
您不一定需要在 async
函数中与 promise 进行交互。在 async
函数中,常规的 throw
语法与 return Promise.reject()
相同,因为 async
函数 always 返回一个 Promise
。我在您的代码中注意到的另一件事是您拒绝了 HTTP 处理程序中的 promise ,这肯定会在以后导致意外行为。您应该直接在处理程序中处理所有错误并相应地采取行动,而不是返回/抛出它们。
您的代码可以这样重写:
request.create = async (id, params) => {
let request = await new Request(Object.assign(params, { property : id })).save()
if ('_id' in request) {
let property = await Property.findById(id)
property.requests.push(request._id)
await property.save()
}
}
还有你的 http 处理程序:
exports.create = async (req, res) => {
try {
await Request.create(req.params.id, req.body)
res.send({
status: 200,
message: lang.__('general.success.created','Request')
})
} catch (err) {
switch (err.constructor) {
case DatabaseConnectionError: // Not connected to database
return res.sendStatus(500) // Internal server error
case UnauthorizedError:
return res.sendStatus(401) // Unauthorized
case default:
return res.status(400).send(err) // Generic error
}
}
}
错误类:
class DatabaseConnectionError extends Error {}
class UnauthorizedError extends Error {}
因为您在 http 处理程序方法中有 try/catch
block ,所以 中任何
方法将在那里被捕获。参见 https://repl.it/LtLo/3有关从 throw
或 reject
的内容Request.createasync
函数或 Promise
抛出的错误如何不需要在首次调用它们的地方直接捕获的更简洁的示例。
关于javascript - 异步函数总是返回 undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46509218/