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