實現一個注冊功能
user.post('/register', async(ctx) => {
let {username, password, rePassword} = ctx.request.body;
if (!username) {
responseClient(ctx, 400, 2, '用戶名不可為空');
return;
}
if (!password) {
responseClient(ctx, 400, 2, '密碼不可為空');
return;
}
if (password !== rePassword) {
responseClient(ctx, 400, 2, '兩次密碼不一致');
return;
}
try{
await User.findOne({username}, function(err, doc){
if(err){
responseClient(ctx);
}
if(doc){
responseClient(ctx, 200, 1, '用戶名已存在');
return;
}else{
//保存到數據庫
let user = new User({
username: username,
password: password,
type: 'user'
});
user.save(function(err, doc){
if(err){
console.log(err);
}
if(doc){
let data = {};
data.username = doc.username;
data.userType = doc.type;
data.userId = doc._id;
responseClient(ctx, 200, 0, '注冊成功', data);
return;
}
});
}
})
}
}catch(e){
responseClient(ctx);
}
})
當我這樣寫的時候有時候會注冊成功有時候就會提示AssertionError [ERR_ASSERTION]: headers have already been sent
后來試了下這種寫法就沒問題
user.post('/register', async(ctx) => {
let {username, password, rePassword} = ctx.request.body;
if (!username) {
responseClient(ctx, 400, 2, '用戶名不可為空');
return;
}
if (!password) {
responseClient(ctx, 400, 2, '密碼不可為空');
return;
}
if (password !== rePassword) {
responseClient(ctx, 400, 2, '兩次密碼不一致');
return;
}
try{
let doc = await User.findOne({username})
if(doc){
responseClient(ctx, 200, 1, '用戶名已存在');
return
}else{
let user = new User({
username: username,
password: password,
type: 'user'
});
let newUser = await user.save();
let data = {};
data.username = newUser.username;
data.userType = newUser.type;
data.userId = newUser._id;
responseClient(ctx, 200, 0, '注冊成功', data);
return;
}
}catch(e){
responseClient(ctx);
}
})
responseClient
responseClient(ctx,httpCode = 500, code = 3,message='服務端異常',data={}) {
let responseData = {};
responseData.code = code;
responseData.message = message;
responseData.data = data;
ctx.status = httpCode;
ctx.body = responseData;
}
請問第一種是我哪里寫錯了嗎?正常的寫法應該怎么寫?
User.findOne()的內容能發(fā)一下嗎?User.findOne()是不是返回Promise?你這樣寫試試:
user.post('/register', async(ctx) => {
let {username, password, rePassword} = ctx.request.body;
if (!username) {
responseClient(ctx, 400, 2, '用戶名不可為空');
return;
}
if (!password) {
responseClient(ctx, 400, 2, '密碼不可為空');
return;
}
if (password !== rePassword) {
responseClient(ctx, 400, 2, '兩次密碼不一致');
return;
}
try{
User.findOne({username}).then(function(doc,err){
if(err){
responseClient(ctx);
}
if(doc){
responseClient(ctx, 200, 1, '用戶名已存在');
return;
}else{
//保存到數據庫
let user = new User({
username: username,
password: password,
type: 'user'
});
user.save(function(err, doc){
if(err){
console.log(err);
}
if(doc){
let data = {};
data.username = doc.username;
data.userType = doc.type;
data.userId = doc._id;
responseClient(ctx, 200, 0, '注冊成功', data);
return;
}
});
}
})
}
}catch(e){
responseClient(ctx);
}
})
先說錯在什么地方
if(err){
responseClient(ctx);
// 此處應該有return
}
err
不為空時已經調用了responseClient
,但是又繼續(xù)往下走,這時doc
顯然是空,所以會走到else
里面
,無論成功或是異常(我也不知道,因為看不到執(zhí)行結果),最后都會再執(zhí)行一次responseClient
。2次調用向客戶端響應的方法,就會出現:
headers have already been sent
第一種方式有點不知所云。callback
和await/async本來是二選一,為什么第一種寫法既有await又有callback?
至于正確的寫法,只能說造成問題的主要是你沒有return,后面的邏輯是否正確還要你自己執(zhí)行看看。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數據專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯網學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術與教育服務機構,發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。