Nodejs和express路由,如何处理客户端的承诺
Nodejs and express routing, how to handle client side promises
我正试图对mongodb进行一次来回路由,但在客户端,我似乎无法从$resource收到的promise中检索数据。在HTML页面上有一个按钮,可以点击以下功能:
$scope.getToken = function() {
console.log('$scope.getToken()');
authenticationService.getToken($scope.data.email).then(function(result) {
$scope.data.token = result;
});
}
收到的结果是:
对象"m",具有字段-0:"j",1:"6",2:"o",3:"p",4:"E",5:"7",6:"X",7:"t",$promise:d,$resold:true,proto:对象
正如您所看到的,我收到了生成的令牌,数据库似乎运行良好,函数也在调用。
客户端接收答案的服务有一个功能:
function getToken(userEmail) {
var deferred = $q.defer();
$resource(baseUrl + '/getToken').save({
email : userEmail
}, function(result, error) {
if(result) {
deferred.resolve(result);
}
else {
deferred.reject(error);
}
});
return deferred.promise;
}
发送此消息的服务器端功能:
var router = require('express').Router();
var authenticator = require('../utils/authUtils');
router.post('/getToken', function(request, response) {
authenticator.getToken(
function(error, result) {
if(error) {
//handle error
}
else if(result) {
response.json(result);
}
}
);
在authUtils.js:中
var mongoUtils = require('./mongoUtils');
getToken : function(callback) {
var genToken = randToken.generate(8);
mongoUtils.query(COLLECTIONS.TOKENS, {'token': { $eq: genToken } },
function(error, result) {
if((result && result.length) || error) {
//handle error or duplicates
}
else if(result) {
callback(null, genToken);
}
}
);
}
在mongoUtils:
query : function(collectionName, query, callback) {
_db.collection(collectionName).find(query).toArray(function (error, result) {
console.log('Utils.query');
if(error) {
//handle error
}
else {
callback(error, result);
}
});
}
为什么服务器端在对象内部发送答案和承诺,以及我应该如何处理它?
将其作为索引对象返回的原因是toArray
in:
_db.collection(collectionName).find(query).toArray(function...
一个可能的解决方案是不在字符串上使用toArray
,或者在返回结果之前调用slice
:
response.status(200).json({token: Array.prototype.slice.call(result)})
另一种可能,因为我可能不完全理解你的问题是尝试:
authenticationService.getToken($scope.data.email).$promise.then(...)
如果是ngResource,我已经通过$promise
访问了then
,只是一个想法。
所以你的问题有三个部分,为什么是对象,为什么承诺以及如何处理它
1:为什么在物体内部
根据Angular官方$resource页面$resource当您使用$resource
时,返回的资源总是对象,而且在API(服务器端)中,您将响应作为json object
发送回来,因此您显然会得到对象。
else if(result)
{
response.json(result);
}
2:为什么承诺
$resource
和$http
都返回一个promise,REST是HTTP的一个子集。这意味着所有可以通过REST完成的事情都可以通过HTTP完成,但不是所有可以通过HTTP执行的事情都能通过REST完成。这就是$resource在内部使用$HTTP的原因$资源构建在$http之上。所以CCD_ 10是肯定的。供参考为什么承诺
3:如何处理
我不太清楚你所说的"如何处理"是什么意思,因为你已经有了对象,我认为你的意思是分离实际生成的令牌数据对象,并保留其他所有内容,如果是这样的话,你可以简单地将结果对象中的数据分配给你的$scope
。
您正在做的是将整个对象分配给具有所有其他对象的$scope
$scope.data.token = result;
您可以简单地将生成的令牌分配给$scope.data.token
例如:
$scope.data.token = result.genToken;
希望这能回答问题。
- Nodejs和express路由,如何处理客户端的承诺
- 实现客户端WebHook处理程序
- 无需刷新即可进行简单的客户端文件处理
- 如何在不使用处理程序的情况下使用ajax将文件从客户端发送到服务器端
- 在客户端的 IFRAME 中对内容进行沙盒处理
- 在服务器端禁用 aspxgridviews,如何在客户端处理
- 在客户端断开连接时释放事件处理程序 Socket.IO
- 简单客户端应用程序中的文件处理
- 如何处理客户端 剑道网格中的错误处理
- 没有客户端 URL 处理的动态网站
- 如何处理客户端节点上的异步请求
- 如何处理客户端运行的 JavaScript 中的意外值
- 正在处理客户端的会话超时
- SignalR处理客户端超时事件
- 目前接受的在浏览器窗口中处理客户端会话信息的无cookie方法
- 使用vb.net处理客户端和服务器端
- 通过排队机制处理客户端脱机http请求
- 如何处理客户端关闭Javascript
- 预处理客户端'使用Java和GWT将本地csv文件数据转换为数组
- 代码处理(客户端而不是在服务器上)