【发布时间】:2019-12-26 03:42:16
【问题描述】:
我正在尝试将我的请求转换为异步调用,以便它们不会阻塞。
app.js
app.use(function(err, req, res, next) {
res.locals.message = err.message;
res.locals.error = req.app.get("env") === "development" ? err : {};
console.log(err);
res.status(err.status || 500);
res.json({ error: err.message });
});
路线
router.get(
"/seatData/:seatNumber",
[
check("seatNumber")
.matches(/^[0-9][a-z]$/i)
.withMessage("must start with a number(0-9) and end with a letter")
],
actions.fetch_seat
);
控制器
exports.fetch_seat = (req, res, next) => {
Seat.getSeatByNumber(req.params.seatNumber, (err, seat) => {
if (err) res.json(err);
else res.json(seat);
});
};
型号
Seat.findSeat = function(key, value) {
return new Promise((resolve, reject) => {
const seat = file.find(r => r[key] === value);
if (!seat) {
reject({
error: true,
message: "Seat not found",
status: 404
});
}
resolve(seat);
});
/*
this.seat = file.find(obj => obj[key] === value);
return this.seat;
*/
};
Seat.getSeatByNumber = function(seatNumber, result, next) {
try {
this.seat = this.findSeat("seatNumber", seatNumber)
.then(seat => {
if (seat !== undefined && Object.keys(seat).length > 0) {
result(null, seat);
} else {
result({ error: true, message: "Seat not found" });
}
})
.catch(error => {
return;
});
} catch (error) {
console.log(error);
}
/* if (this.seat !== undefined && Object.keys(this.seat).length > 0) {
result(null, this.seat);
} else {
result({ error: true, message: "Seat not found" });
}*/
};
我尝试遵循一些在线指南,但我似乎无法将错误响应回复为表达。 /* ... */ 中的代码是我要转换的原始代码
更新
第 1 次捕获和第 2 次捕获有什么区别。还有我的 app.js 怎么没有捕捉到我返回的状态码?
Seat.findSeat = function(key, value) {
return new Promise((resolve, reject) => {
const seat = file.find(r => r[key] === value);
if (!seat) {
reject({
error: true,
message: "Seat not found",
status: 404
});
}
resolve(seat);
});
};
Seat.getSeatByNumber = function(seatNumber, result, next) {
try {
this.seat = this.findSeat("seatNumber", seatNumber)
.then(seat => {
console.log(seat);
if (seat !== undefined && Object.keys(seat).length > 0) {
result(null, seat);
} else {
result({ error: true, message: "Seat not found" });
}
})
.catch(error => {
console.log("1st catch");
return result(error);
});
} catch (error) {
console.log("outer catch");
console.log(error);
result(error);
}
};
app.js 此处未记录错误
app.use(function(err, req, res, next) {
res.locals.message = err.message;
res.locals.error = req.app.get("env") === "development" ? err : {};
console.log('apperro' , err) // <-- does not log this
res.status(err.status || 500);
res.json({ error: err.message });
});
更新 2
添加next 后出现以下错误。您可以将seatData/1T 传入沙箱中的url https://codesandbox.io/s/elucidate-api-fokd8
(node:319) UnhandledPromiseRejectionWarning: TypeError: next is not a function
at Seat.getSeatByNumber (/sandbox/src/controller/appController.js:15:14)
at findSeat.then.catch.error (/sandbox/src/model/seat.js:45:16)
(node:319) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:319) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
【问题讨论】:
标签: javascript express asynchronous promise