Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我的代码是使用async await的最佳方式吗?_Javascript_Express_Async Await - Fatal编程技术网

Javascript 我的代码是使用async await的最佳方式吗?

Javascript 我的代码是使用async await的最佳方式吗?,javascript,express,async-await,Javascript,Express,Async Await,我试图在我的登录示例中实现和学习异步等待函数,但我不知道这是否是最好的、优雅的和干净的代码。我在捕捉错误时遇到了一些麻烦,如果我需要以最好的方式实现常量和函数编程的话。你能分享你的观点吗 谢谢你的代码显示了几个问题: 您试图发送双重响应。首先抛出res.status404.json。。。。然后,捕获该异常并再次执行res.status404.jsone。那是不对的。如果要发送响应,请返回,不要抛出。或者,只抛出异常而不发送响应,然后从catch处理程序发送实际的错误响应 另外,抛出res.sta

我试图在我的登录示例中实现和学习异步等待函数,但我不知道这是否是最好的、优雅的和干净的代码。我在捕捉错误时遇到了一些麻烦,如果我需要以最好的方式实现常量和函数编程的话。你能分享你的观点吗


谢谢你的代码显示了几个问题:


您试图发送双重响应。首先抛出res.status404.json。。。。然后,捕获该异常并再次执行res.status404.jsone。那是不对的。如果要发送响应,请返回,不要抛出。或者,只抛出异常而不发送响应,然后从catch处理程序发送实际的错误响应

另外,抛出res.status404.json{error:'No match'};发送响应,然后抛出.json返回的可能不是您想要的结果。这不会是任何类型的错误对象

我更喜欢将发送错误响应的位置集中到请求处理程序中的一个位置。在我看来,这使您永远不会尝试发送多个响应,只会使请求处理程序的流程更容易理解

为此,我只抛出一个自定义错误,该错误可能与自定义消息/状态关联,然后在一个位置捕获所有可能的错误。这里有一种方法。myError类可以在项目中的任何地方使用,而不仅仅限于一条路线。其思想是,通常在抛出时,您知道在该上下文中希望状态和消息是什么,因此您可以在自定义错误对象中设置该状态和消息,然后可以在catch中使用该信息。然后,catch必须确定它是有您的自定义错误,还是只有一个常规错误。首先,我有一个可重用的错误子类,它不仅允许我抛出一条消息,还允许我抛出一个状态值

// reusable error class that contains a status in addition to the message
class MyError extends Error {
    // this static method saves having to compare if it's a custom error object or not
    // every time we use this
    static sendError(res, e, status = 500) {
        if (e instanceof MyError) {
            e.sendError(res);
        } else {
            res.sendStatus(status);
        }
    }
    constructor(msg, status = 500) {
        // allow calling with or without new
        if (!(this instanceof MyError)) {
            return new MyError(msg, status);
        }
        super(msg);
        this.status = status;
    }
    sendError(res) {
        res.status(this.status).send(this.message);
    }
}
下面是如何在代码中使用它,并集中发送错误状态

app.post('/', async (req, res) => {

    try {

        const { email } = req.body.email; // destructuring

        const usuarioEncontrado = await Usuario.findOne({email: email});

        // Validate user exist
        if (!usuarioEncontrado) { // when not exist return null
            throw MyError('El usuario no existe', 404);
        }

        // validate user pass
        if (!bcrypt.compareSync(req.body.password, usuarioEncontrado.password)) {
            throw MyError('No Match', 404);
        }

        const token = jwt.sign( // generate token
            {
                usuario: usuarioEncontrado 
            },
            SEED,
            {
                expiresIn: (60 * 60)
            }
        );

        res.status(200).json({ // send response
            token: token,
            usuario: usuarioEncontrado
        });

    } catch (e) { // log and send error response
        // e may be either MyError or some other system generated Error
        console.log(e);
        MyError.sendError(res, e);
    }
}

如果你有问题,并且没有找到任何有用的答案,你应该尝试一些东西并问一个问题。你试图发送双重回复。首先抛出res.status404.json。。。。然后,捕获该异常并再次执行res.status404.jsone。那是不对的。如果要发送响应,请返回,不要抛出。或者,只抛出异常而不发送响应,并从catch处理程序发送实际的错误响应;发送响应,然后抛出.json返回的可能不是您想要的结果。这不会是任何类型的错误对象。
app.post('/', async (req, res) => {

    try {

        const { email } = req.body.email; // destructuring

        const usuarioEncontrado = await Usuario.findOne({email: email});

        // Validate user exist
        if (!usuarioEncontrado) { // when not exist return null
            throw MyError('El usuario no existe', 404);
        }

        // validate user pass
        if (!bcrypt.compareSync(req.body.password, usuarioEncontrado.password)) {
            throw MyError('No Match', 404);
        }

        const token = jwt.sign( // generate token
            {
                usuario: usuarioEncontrado 
            },
            SEED,
            {
                expiresIn: (60 * 60)
            }
        );

        res.status(200).json({ // send response
            token: token,
            usuario: usuarioEncontrado
        });

    } catch (e) { // log and send error response
        // e may be either MyError or some other system generated Error
        console.log(e);
        MyError.sendError(res, e);
    }
}