我通过构建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;
感谢您的帮助!
答案 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
功能正常。