Javascript 节点脚本需要将成功/失败返回给调用它的服务
我试图向将写入文件的节点函数发出请求,但我不确定将成功或失败返回给angular的最佳方法。设置如下所示:Javascript 节点脚本需要将成功/失败返回给调用它的服务,javascript,angularjs,node.js,promise,Javascript,Angularjs,Node.js,Promise,我试图向将写入文件的节点函数发出请求,但我不确定将成功或失败返回给angular的最佳方法。设置如下所示: //controller (in an ng-click handler) writeFileRoute.writeFile(file) .then(function(response){ console.log('success', response); }, function(error){ console.log('error', error); });
//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;
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;
因此,文件实际上正在写入。我只是不知道如何将这些单独工作的组件组合成能够通知Angle成功或失败的东西。我考虑过使用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};
});
});
在
app.post
中,您必须通过res
将内容返回给客户端。使用res.send(数据或错误)
见:
这也意味着您不需要从服务器到客户端的承诺。
writeFileRoute
的承诺将通过res
返回来解决。在app.post
中,您必须通过res
将东西返回给客户端。使用res.send(数据或错误)
见:
这也意味着您不需要从服务器到客户端的承诺。
writeFileRoute
的承诺将通过res
返回来解决。承诺是回调的一个很好的替代方案,Q
是一个很好的承诺库,可用于节点.js
后端:
var Q=require('Q')代码>
您的服务器将如下所示:
//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;
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;
请注意,该方法用于调用Node.js样式的函数并获取承诺
您的组件.writefile
现在返回一个承诺,您在app.post
中所做的事情可能是两件事(请查看以下内容):
如果您的承诺被拒绝,则捕获任何错误(catch
方法被调用)
Istead,如果承诺已解决,则调用
方法
我看不出您的fronted有任何错误,事实上,它已经使用了Promission:请注意,$http
返回了一个Promise(请查看它)。Promises是回调的一个非常好的替代方法,Q
是一个非常好的Promise库,可用于节点.js
后端:
var Q=require('Q')代码>
您的服务器将如下所示:
//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;
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;
请注意,该方法用于调用Node.js样式的函数并获取承诺
您的组件.writefile
现在返回一个承诺,您在app.post
中所做的事情可能是两件事(请查看以下内容):
如果您的承诺被拒绝,则捕获任何错误(catch
方法被调用)
Istead,如果承诺已解决,则调用
方法
我看不出你的fronted有任何错误,事实上,它已经使用了承诺:请注意,$http
返回一个承诺(看看它的承诺)。文件是异步写入的,但是你没有收到通知,因为你正在将回调传递到组件。writefile
(这实际上是作为app.post
的第二个参数传递的函数)只有当出现错误时才会调用它。@charliebrownie老实说,我想我更喜欢使用承诺而不是回调。是的,承诺是回调的一个很好的替代方法。我通常使用承诺。然后你应该在服务器中使用Q。你已经在前面使用了它们,因为$http
使用它们(看一看,您正在使用然后
方法)就是这样,我希望它能有所帮助!文件正在异步写入,但您没有收到通知,因为您正在将回调传递到components.writefile
(实际上是作为app.post
的第二个参数传递的函数)只有当出现错误时才会调用它。@charliebrownie老实说,我想我更喜欢使用承诺而不是回调。是的,承诺是回调的一个很好的替代方法。我通常使用承诺。然后你应该在服务器中使用Q。你已经在前面使用了它们,因为$http
使用它们(看一看,你正在使用then
method)它就在那里,我希望它能有所帮助!`而且Q是一个极好的Promise库`——如果你正在使用Q(相对于像bluebird这样的现代库)你也可以使用本地的ES承诺。@BenjaminGruenbaum你能展示一下你如何使用蓝鸟吗?@charliebrownie所以我这里缺少的是如何让angular成功。你能展示一下服务/控制器中应该是什么样子吗?谢谢!还有,你知道为什么@BenjaminGruenbaum认为Q
和ES pro吗米塞斯是低人一等的?我重读了你文章的最后一部分,完全错过了关于前端的部分。对不起,我想当时我很心烦意乱。如果原生的$http
使用承诺,你会用$q
做什么?`如果你用的是q(相对于像蓝鸟这样的现代图书馆),q是一个很好的承诺库'你也可以使用本地的ES承诺。@BenjaminGruenbaum你能展示一下你如何使用蓝鸟吗?@charliebrownie所以我这里缺少的是如何让angular成功。你能展示一下服务/控制器中应该是什么样子吗?谢谢!还有,你知道为什么@BenjaminGruenbaum认为Q
和ES pro吗米塞斯是低人一等的?我重读了你文章的最后一部分,完全没有读到关于前端的部分。对不起,我想当时我很心烦意乱。如果原生$http
使用承诺,你会用$q
做什么?