我正在尝试向将要写入文件的节点函数发出请求,但我不确定将成功或失败恢复到角度的最佳方法。设置如下:
//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
,但我不知道哪个是正确的解决方案或在哪里插入它们。
这是我目前正在使用的代码:
角:
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};
});
});
答案 0 :(得分:2)
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样式的函数并返回一个promise。
您的components.writefile
现在返回一个承诺,您在app.post
中执行的操作可能是两件事(请查看Promise Core Methods):
catch
方法被调用)then
方法。我认为你的前端没有任何错误,事实上,它已经使用了Promises:注意$http
返回一个Promise(看看它是Documentation)。
答案 1 :(得分:1)
在app.post
中,您必须通过res
将某些内容返回给客户。使用res.send(data or error)
请参阅:http://expressjs.com/en/api.html
这也意味着您不需要从服务器到客户端的承诺。 writeFileRoute
的承诺将通过res
返回来解决。