节点错误:发送后无法设置标题。 怎么解决?

用户单击loginbutton后,服务器通过显示“发送后无法设置标题”错误来closures自身。 任何帮助?

Server.js文件

app.put('/users/signin',function(req,res,next){ db.collection('users',function(err,usersCollection){ usersCollection.findOne({username:req.body.username},function(err,user){ bcrypt.compare(req.body.password,user.password,function(err,result){ if(result){ var token = jwt.encode(user,JWT_SECRET); return res.json({token:token}); }else{ res.status(400).send(); } }) }); }); res.send(); }); 

控制器从哪里我打电话给服务器..

 $scope.signin = function(){ $http.put('/users/signin',{username:$scope.username,password:$scope.password}) .then(function(res){ $cookies.put('token',res.data.token); $scope.currentUser = $scope.username; alert("Successfully signed in"); },function(err){ alert("bad login credentials"); }); }; 

usersCollection.findOne是asynchronous的,它的callback是在res.send();之后调用的res.send(); 被称为。

移动res.send(); 进入bcrypt.comparecallback。

 app.put('/users/signin', function(req, res, next) { db.collection('users', function(err, usersCollection) { usersCollection.findOne({ username: req.body.username }, function(err, user) { bcrypt.compare(req.body.password, user.password, function(err, result) { if (result) { var token = jwt.encode(user, JWT_SECRET); res.json({ token: token }); } else { res.status(400); } // like here res.send(); }); }); }); }); 

什么是callback?

从维基百科 , callback是一个可执行代码作为parameter passing给其他代码 。 根据定义,callback没有任何asynchronous,但是与asynchronous编程一起使用是一个非常有用的概念。

在JavaScript中,函数可以将函数引用作为参数,作为callback函数。

 function someFunction(callback) { console.log("before async callback"); setTimeout(callback, 1); // calls the callback asynchronously console.log("after async callback"); } 

可以使用现有的函数来调用它

 function myExistingFunction() { console.log("inside a callback"); } someFunction(myExistingFunction); 

或者像这样,使用函数expression式

 someFunction(function(){ console.log("inside a callback"); }); 

这两个调用someFunction会按以下someFunction将以下内容打印到控制台:

 before async callback after async callback inside a callback 

为什么按这个顺序?

由于someFunction函数将callback传递给asynchronous函数setTimeout ,因此callback不会立即调用,而只会在调用堆栈结束之后调用。 所以someFunction完全完成,然后在某个时候,我们的callback被称为。

看一眼

  • 以Layman的术语理解asynchronous代码
  • 初学者的JavaScript:asynchronous
  • Node.js在实践中asynchronous:何时使用什么? 具体涉及到节点和快递