节点脚本需要向调用它的 Angular 服务返回成功/失败
Node script needs to return success/failure to Angular service that called it
我正在尝试向将写入文件的节点函数发出请求,但我不确定将成功或失败恢复为角度的最佳方法。设置如下所示:
//controller (in an ng-click handler)
writeFileRoute.writeFile(file)
.then(function(response){
console.log('success', response);
}, function(error){
console.log('error', error);
});
//service
app.service('WriteFileService', function($http) {
this.writeFile = function(data) {
return $http.post('/writeFile', data)
.then(function(response) {
return {
'success': response
};
}, function(response) {
return {
'error': response
};
});
};
})
//server.js
app.post('/writeFile', function(req, res){
components.writefile(req.body, function(err){
//do something with error here?
});
//by this point I have become increasingly confused by what is going on
//node write script
var writefile = function(data, callback){
//data = JSON.stringify(data).message;
fs.writeFile('./testFile.txt', data.message, function(err){
callback(err);
});
};
module.exports = exports = writefile;
所以文件实际上是在写入。我只是不知道如何将这些单独的工作组件组合成可以通知成功或失败的角度的东西。我想过使用q
,但是我不知道我应该使用角度$q
还是节点Q
。我真的很想使用Q
和/或$q
,但我不知道哪个是正确的解决方案或将它们插入何处。
编辑(2月3日)
这是我目前正在使用的代码:
角:
angular.module('test', [])
.controller('ctrl', function($scope, WriteService){
$scope.testMessage = "test"
$scope.writeTheFile = function(){
WriteService.write()
.then(function(err){
if (err){
console.log(err);
}else{
console.log('no error');
}
});
}
})
.service('WriteService', function($http){
this.write = function(){
$http.get('./write/', function(response){
return {'success': response};
}, function(error){
return {'error': error};
});
};
});
节点写入模块
var writes = {
nfcall: function(data){
data = data.repeat(5);
return Q.nfcall(fs.writeFile, dest, data);
}
}
节点服务器
app.get('/write/', function(req, res, next){
var data = 'some text string ' + +new Date() + ''n';
writeModule.nfcall(data)
.then(function(response){
return {'response': response};
})
.catch(function(err){
return {'index.js error': err};
});
});
Promise
是回调的一个非常好的替代方案,Q
是一个很好的 Promise 库,可以在你的node.js
后端使用:
var Q = require('q');
您的服务器将如下所示:
app.post('/writeFile', function(req, res, next) {
components.writefile(req.body)
.then(function() {
// Success! 'Writefile' worked fine, just send some 200 OK response.
res.send('OK');
})
.catch(function(err) {
// If 'Writefile' fails, this will be called!
// Just pass the error to the Error Handling middleware
next(err);
});
});
var writefile = function(data){
return Q.nfcall(fs.writefile, './testFile.txt', data.message);
};
module.exports = exports = writefile;
请注意,nfcall()
方法用于调用 Node .js样式的函数并获取承诺。
您的components.writefile
现在返回一个承诺,您在app.post
中所做的可能是两件事(请查看承诺核心方法):
- 在承诺被拒绝时捕获任何错误(调用
catch
方法) - Istead,如果承诺已解决,则调用
then
方法。
我没有看到你的正面有什么问题,事实上,它已经使用了承诺:请注意,$http
返回一个承诺(看看它的文档)。
在app.post
中,你必须通过res
将一些东西返回给客户端。使用res.send(data or error)
请参阅:http://expressjs.com/en/api.html
这也意味着您不需要从服务器到客户端的承诺。writeFileRoute
的承诺将通过res
回报来解决。
相关文章:
- 使用angular.js问题的JavaSpringREST服务
- Angular使服务可以从任何地方访问
- Angular 2和服务单元测试
- Angular js-尚未添加PUT请求到服务的URL
- 可以't访问Angular.js服务中的功能
- 通过服务Angular向服务器发送$routeParam
- chrome.storage.sync.get未返回值-Angular服务
- 如何在angular中使构造函数之外的服务可用
- Http服务工厂将未定义的返回到Angular中的控制器
- 如何调用用nodejs编写的服务形式angular
- 由控制器调用的服务更改时,Angular未更新视图
- 正在Angular 2中的扩展RouterOutlet中导入自定义服务以进行身份验证
- 将Browserify与Angular JS结合使用--将服务传递到控制器中
- AngularJS剑道网格绑定到angular服务webapi-当使用[fromuri]进行解析时,排序总是为null
- Angular JS$编译服务导致$watch内存泄漏
- 如何在angular js中的工厂/服务中使用$cookie
- angular如何在我的情况下设置服务
- 在一个服务中引用多个API调用(Angular)
- 使用web服务Java-angular时出现错误404
- $http服务angular不工作