Node.js 从express services传递错误消息

Node.js 从express services传递错误消息,node.js,express,Node.js,Express,在我的节点应用程序中,我有以下代码 import gravatar from 'gravatar'; import bcrypt from 'bcryptjs'; import config from 'config'; import jwt from 'jsonwebtoken'; import { User } from '../models/user'; class AuthService { /** Register user */ async registerUser(us

在我的节点应用程序中,我有以下代码

import gravatar from 'gravatar';
import bcrypt from 'bcryptjs';
import config from 'config';
import jwt from 'jsonwebtoken';

import { User } from '../models/user';

class AuthService {
  /** Register user */
  async registerUser(userDto) {
    const { firstName, lastName, email, password } = userDto;

    let user = await User.findOne({ email });
    if (user) throw new Error('Email already exists');

    const avatar = this.createAvatar(email);

    user = new User({ firstName, lastName, email, password, avatar });
    user.password = await this.hashPassword(user.password);
    await user.save();

    const token = this.generateAuthToken(user);
    return { user, token }
  }
当有一封重复的电子邮件时,邮递员会给出正确的错误消息,但它是这样的

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Error</title>
    </head>
    <body>
        <pre>Error: Email already exists
            <br> &nbsp; &nbsp;at AuthService._callee$ (/home/shashika/PROJECTS/developer-connector/server/services/authService.js:14:21)
            <br> &nbsp; &nbsp;at tryCatch (/home/shashika/PROJECTS/developer-connector/server/node_modules/regenerator-runtime/runtime.js:65:40)
            <br> &nbsp; &nbsp;at Generator.invoke [as _invoke] (/home/shashika/PROJECTS/developer-connector/server/node_modules/regenerator-runtime/runtime.js:303:22)
            <br> &nbsp; &nbsp;at Generator.prototype.&lt;computed&gt; [as next] (/home/shashika/PROJECTS/developer-connector/server/node_modules/regenerator-runtime/runtime.js:117:21)
            <br> &nbsp; &nbsp;at step (/home/shashika/PROJECTS/developer-connector/server/services/authService.js:30:191)
            <br> &nbsp; &nbsp;at /home/shashika/PROJECTS/developer-connector/server/services/authService.js:30:361
            <br> &nbsp; &nbsp;at processTicksAndRejections (internal/process/task_queues.js:89:5)
        </pre>
    </body>
</html>

错误
错误:电子邮件已存在

在AuthService._callee$(/home/shashika/PROJECTS/developer connector/server/services/AuthService.js:14:21)
在tryCatch(/home/shashika/PROJECTS/developer connector/server/node_modules/registrator runtime/runtime.js:65:40)
在Generator.invoke[as_invoke](/home/shashika/PROJECTS/developer connector/server/node_modules/registrator runtime/runtime.js:303:22)
在Generator.prototype.computed[as next](/home/shashika/PROJECTS/developer connector/server/node_modules/registrator runtime/runtime.js:117:21)
在步骤(/home/shashika/PROJECTS/developer connector/server/services/authService.js:30:191)
at/home/shashika/PROJECTS/developer connector/server/services/authService.js:30:361
在处理和拒绝时(内部/process/task_queues.js:89:5)

我只想要错误信息。但是为什么这会给我这个html代码呢?

这是来自express/node的。这是一个例外,不应提供给客户。您应该捕获错误并用自己的错误详细信息进行响应。

错误仅在服务器内部抛出。您应该做的是使用适当的HTTP错误代码创建一个响应,并将其发送回客户端。 假设您在上面的其他地方发现了错误,您的代码应该是这样的。如果您不告诉我们您在哪里以及如何呼叫registerUser

export default (err, req, res, next) => {
    console.log('Server err', err.message);

    return res.status(err.status || 500).json({
        error: err.message
    });
};

您可以创建用于错误处理的全局中间件。这只是它如何工作的示例代码。只需将此中间件作为index.js(app.js?)中的最后一个中间件

errorMiddleware.js

import errors from './middleware/errorMiddleware';
...
// your middlewares
...
app.use(errors);
app.js


这只是一个基本示例,您可以按照自己的方式对其进行自定义(仅在开发环境中发送err.message,或者根据错误类型或状态处理错误等等)。使用try/catch和express next()方法处理错误也是一种很好的方法。

可以显示路由器代码吗?
import errors from './middleware/errorMiddleware';
...
// your middlewares
...
app.use(errors);