我正在一個自制的RBAC系統上快速的NodeJS基於兩個層面:快速的NodeJS多個回調錯誤
- 首先,驗證用戶是否具有執行此操作的權限的角色。
- 其次,驗證用戶是否有正確的計劃來執行此操作。
,我創建這樣的中間件:
exports.can = function (resource, action) {
return function (request, response, next) {
action = action || request.method;
if (!request.user) {
return next(new errors.UnauthorizedError());
}
request.user.can(request.user.role, request.user.currentPack, resource, action, function (can, error) {
if (error) return next(error);
if (!can) {
return next(new errors.UnauthorizedError());
}
return can;
});
return next();
};
};
我加入到我的用戶模型,這個方法:
const rbac = new RBAC(rbacJson);
const pack = new PACK(packJson);
schema.method('can', function (role, userPack, resource, action, next) {
let can = false;
action = action.toUpperCase();
can = rbac.can(role, resource, action);
if (can) {
can = pack.can(userPack, resource, action, function (can) {
return next(can);
});
}
return next(can);
});
在我的方法pack.can(......)我需要執行這樣的貓鼬查詢:
PACK.prototype.can = function (pack, resource, action, next) {
let can = true;
// some sequantial code
Trader.count({/* some conditions */}, function (err, count) {
if(count == 0) return next(true);
return next(false);
});
return can;
};
我的問題是當返回貓鼬查詢是下一個(假的),我有這樣的錯誤:
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11)
at ServerResponse.header (/home/invoice/node_modules/express/lib/response.js:730:10)
at ServerResponse.send (/home/invoice/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/home/invoice/node_modules/express/lib/response.js:256:15)
at ServerResponse.response.apiResponse (/home/invoice/server/config/middlewares/api.js:10:14)
at /home/invoice/server/controllers/api/invoice/traders.js:130:21
at /home/invoice/node_modules/mongoose/lib/model.js:3835:16
at /home/invoice/node_modules/mongoose/lib/services/model/applyHooks.js:162:20
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickDomainCallback (internal/process/next_tick.js:128:9)
經過調查,我發現該錯誤可能是由於雙回撥電話:
can = pack.can(userPack, resource, action, function (can) { return next(can); });
return next(new errors.UnauthorizedError());
但我不知道如何解決這個問題。 我希望我能很好的解釋我的問題。
謝謝你很多爲你的解釋。你所描述的片段'obj.doSomething(function(){next}(); // next 1 }); return next();' 是非常有幫助的。 「在某些地方,你的代碼似乎不清楚它是試圖同步還是異步」爲了回答你的問題,我也有點困惑,因爲我還沒有真正理解異步的概念。 – medKHELIFI