需要實現的功能:
在注冊前對用戶名及電子郵箱進行驗重。
由于需要明確的返回注冊失敗原因,因此并未使用or, 而是使用了兩次查詢。
代碼如下:
dbutil.query('select id from user where username="拭目以待"', function (err,data){
if(data.length !== 0){
goBack('用戶名被占用');
}
});
dbutil.query('select id from user where email="182209508@qq.com"', function (err,data){
if(data.length !== 0){
goBack('該郵箱已注冊');
}
});
function goBack(msg){
var errorJSON = {
status: 'error',
msg: msg
};
res.write(JSON.stringify(errorJSON));
res.end();
}
執行后的錯誤信息:
Error: write after end
at ServerResponse.OutgoingMessage.write (_http_outgoing.js:426:15)
at goBack (/Users/baukh/work/baukhZone/exports/userManager.js:109:21)
at /Users/baukh/work/baukhZone/exports/userManager.js:96:21
at Query._callback (/Users/baukh/work/baukhZone/dbutil.js:36:33)
at Query.Sequence.end (/Users/baukh/work/baukhZone/node_modules/mysql/lib/protocol/sequences/Sequence.js:85:24)
at Query._handleFinalResultPacket (/Users/baukh/work/baukhZone/node_modules/mysql/lib/protocol/sequences/Query.js:144:8)
at Query.EofPacket (/Users/baukh/work/baukhZone/node_modules/mysql/lib/protocol/sequences/Query.js:128:8)
at Protocol._parsePacket (/Users/baukh/work/baukhZone/node_modules/mysql/lib/protocol/Protocol.js:280:23)
at Parser.write (/Users/baukh/work/baukhZone/node_modules/mysql/lib/protocol/Parser.js:74:12)
at Protocol.write (/Users/baukh/work/baukhZone/node_modules/mysql/lib/protocol/Protocol.js:39:16)
經過排查發現: 同時執行多個數據庫操作,在只有一個返回結果時,將請求跳出就會導至這種[Error: write after end]錯誤。
修改后的代碼:
dbutil.query('select id from user where username="拭目以待"', function (err,data){
if(data.length !== 0){
goBack('用戶名被占用');
}
else{
dbutil.query('select id from user where email="182209508@qq.com"', function (err,data){
if(data.length !== 0){
goBack('該郵箱已注冊');
}
});
}
});
function goBack(msg){
var errorJSON = {
status: 'error',
msg: msg
};
res.write(JSON.stringify(errorJSON));
res.end();
}