节点错误:发送后无法设置标题。 怎么解决?
用户单击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.compare
callback。
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:何时使用什么? 具体涉及到节点和快递