首页 > 解决方案 > 在 Express POST 中隐藏 JSON 解析错误

问题描述

我有这个小型 Express 服务器:

var express = require("express");

var app = express();
app.use(express.json());

app.post("/hackme", (req, res) => {

    if(!req.body.foo) {
        return res.send({ error: 'oh no' });
    }

    return res.send({ lbxapi: '1.1' });
});

app.listen(3050, function() {
  console.log("Express running");
});

当我将无效的 JSON POST 正文发送到以下服务器时,我会得到完整的错误堆栈,例如:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Error</title>
    </head>
    <body>
        <pre>SyntaxError: Unexpected string in JSON at position 18
            <br> &nbsp; &nbsp;at JSON.parse (&lt;anonymous&gt;)
            <br> &nbsp; &nbsp;at parse (/home/jan/Desktop/linkbox_beta2_github/code/experiments/node_modules/body-parser/lib/types/json.js:89:19)
            <br> &nbsp; &nbsp;at /home/jan/Desktop/linkbox_beta2_github/code/experiments/node_modules/body-parser/lib/read.js:121:18
            <br> &nbsp; &nbsp;at invokeCallback (/home/jan/Desktop/linkbox_beta2_github/code/experiments/node_modules/raw-body/index.js:224:16)
            <br> &nbsp; &nbsp;at done (/home/jan/Desktop/linkbox_beta2_github/code/experiments/node_modules/raw-body/index.js:213:7)
            <br> &nbsp; &nbsp;at IncomingMessage.onEnd (/home/jan/Desktop/linkbox_beta2_github/code/experiments/node_modules/raw-body/index.js:273:7)
            <br> &nbsp; &nbsp;at IncomingMessage.emit (events.js:182:13)
            <br> &nbsp; &nbsp;at endReadableNT (_stream_readable.js:1091:14)
            <br> &nbsp; &nbsp;at process._tickCallback (internal/process/next_tick.js:174:19)
        </pre>
    </body>
</html> 

我不想让用户看到这个。我该如何隐藏它?将接受更改我的服务器代码的答案,以便我不再看到它。谢谢!

标签: javascriptnode.jsjsonexpress

解决方案


感谢 Ariel Alvarado 的评论(= 使用默认错误处理程序),我可以回答我自己的问题:

var express = require("express");

var app = express();
app.use(express.json());

// added this error handler
app.use(function (err, req, res, next) {
    console.error(err.stack)
    res.status(500).send('Something broke!')
});

app.post("/hackme", (req, res) => {

    if(!req.body.foo) {
        return res.send({ error: 'oh no' });
    }

    return res.send({ lbxapi: '1.1' });
});

app.listen(3050, function() {
console.log("Express running");
});

推荐阅读