Rumah > Soal Jawab > teks badan
1. Adakah konfigurasi pelayan berikut untuk menangkap pengecualian penghalaan betul?
server.js
const express = require("express");
const app = express();
// ...加载中间件
// ...配置路由
// 异常处理
// 如果是开发环境,则打印异常到控制台
if (app.get("env") === "development") {
app.use((err, req, res, next) => {
console.error("Error",err);
next(err);
});
}
// 如果是非开发环境,则向页面输出错误信息
app.use((err, req, res, next) => {
res.status(err.status || 500);
res.render("error", {
message: err.message,
error: {}
});
});
app.listen(3000);
2. Berikut ialah objek penghalaan Jika tiada janji (async/menunggu), pengecualian akan dilemparkan secara normal dan ditangkap dalam pelayan
xxxRouter.js
const router = require("express").Router();
router.all("/test/error", (req, res) => {
throw new Error("我就是异常!!!");
});
Tetapi dalam kes promise (async/wait), ralat akan dilaporkan dalam konsol, dan tangkapan dalam pelayan tidak dapat ditangkap, mengakibatkan q tamat masa
(node:30875) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: 我就是异常!!!
(node:30875) 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.
xxxRouter.js
const router = require("express").Router();
router.all("/test/error", async(req, res) => {
throw new Error("我就是异常!!!");
});
3 Dalam penggunaan sebenar, setiap laluan mesti mencuba/menangkap dan mengendalikan pengecualian, yang terasa sangat berlebihan
// 冗余的router
router.all("/test1", async(req, res) => {
try{
// ...处理一些事务
// ...各种 await
res.end(
// 成功返回内容
);
}catch(err){
// 此处希望throw err 让server接收并处理,但是会报错
res.end(
// 失败返回内容
);
}
});
// ...之后还有很多router都要try/catch依次处理异常
=、=
伊谢尔伦2017-05-16 13:37:30
Fungsi async mengembalikan objek Promise
Pengecualian yang dilemparkan dalam fungsi ini perlu menghantar catch()
atau then( )
untuk mengendalikan. parameter kedua. Promise
对象,这个函数中抛出的异常需要通过 Promise
对象的 catch()
或 then()
的第 2 个参数来处理。
当然如想外层函数用了 await
,就不是用 catch()
或 then()
来处理了,而是像同步调用那样用 try ... catch ...
menunggu
, ia tidak akan dikendalikan dengan catch()
atau then()
, tetapi seperti penggunaan penyegerakan cuba ... tangkap ...
untuk mengendalikan panggilan. Dalam tanggapan saya, Express sendiri tidak menyokong Promise/yield/async/wait (saya tidak tahu sama ada versi baharu telah membangunkan sokongan berkaitan). Pada masa kini, Koa, yang mempunyai sokongan yang lebih baik untuk Promise/yield/async/wait, biasanya digunakan. 🎜