正确的异步/等待代码节点js

时间:2016-09-15 21:55:29

标签: javascript node.js asynchronous promise async-await

我通过构建API学习nodejs,这是注册部分。

在尝试所有现有方法编写异步代码后,我得出了这个结果。这是正确的方法吗?

我首先想到await / async替换Promise ......是吗?

我真的需要在我的2个函数上以这种方式返回Promise吗?

在返回结果之前,我是否以这种方式调用它们?

import * as db from '../../db';

const addToDatabase = (req) => {
    return new Promise((res, rej) => {

        db.get().collection('users').insertOne({
            req.body
        }, (err) => {
            if (err) {
                rej('Unable to insert to database on registration');
            }
            else {
                res();
            }
        });
    });
};

const checkDuplicate = (req) => {
    return new Promise( async (res, rej) => {
        let collection = await db.get().collection('users');

        collection.find(/* query */).toArray( (err, docs) => {
            if (err) {
                rej('Unable to check database.');
            }
            else {
                if (docs.length) {
                    rej('Email/login already used');
                }
                else {
                    res();
                }
            }
        });
    });
};

const register = async (req, res) => {
    try {
        await checkDuplicate(req);
        await addToDatabase(req);
        return res.send({success: true, msg: 'Successful registration'});
    } catch(err) {
        return res.send({success: false, error: err});
    }
};

export default register;

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

  

我首先想到await / async替换Promise ......是吗?

不,他们补充他们。它们只会替换then次来电。

  

我真的需要在我的2个函数上以这种方式返回Promise吗?

不,在你的第二个功能中,你不应该创造这样的承诺。 绝不要将async function用作new Promise执行者。您应该只promisify toArray方法而不是其他方法。实际上,如果你没有通过回调,mongodb已经返回了promises,所以你应该使用

async function addToDatabase(req) {
    try {
        await db.get().collection('users').insertOne({
            req.body
        });
    } catch(err) {
        throw 'Unable to insert to database on registration';
    }
}
async function checkDuplicate(req) {
    let collection = await db.get().collection('users');
    let docs;
    try {
        docs = await collection.find(/* query */).toArray();
    } catch(err) {
        throw 'Unable to check database.';
    }
    if (docs.length) {
        throw 'Email/login already used';
    }
}
  

在返回结果之前,我是否以这种方式调用它们?

是的,您的register功能正常。