节点脚本需要将成功/失败返回给调用它的Angular服务

时间:2016-01-14 16:19:47

标签: javascript angularjs node.js promise

我正在尝试向将要写入文件的节点函数发出请求,但我不确定将成功或失败恢复到角度的最佳方法。设置如下:

//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};
  });
});

2 个答案:

答案 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):

  1. 如果您的承诺被拒绝(catch方法被调用)
  2. ,则会收到任何错误
  3. Istead,如果承诺得到解决,则会调用then方法。
  4. 我认为你的前端没有任何错误,事实上,它已经使用了Promises:注意$http返回一个Promise(看看它是Documentation)。

答案 1 :(得分:1)

app.post中,您必须通过res将某些内容返回给客户。使用res.send(data or error)

请参阅:http://expressjs.com/en/api.html

这也意味着您不需要从服务器到客户端的承诺。 writeFileRoute的承诺将通过res返回来解决。