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

Node script needs to return success/failure to Angular service that called it

本文关键字:服务 Angular 返回 成功 失败 脚本 调用 节点      更新时间:2023-09-26

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

//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中所做的可能是两件事(请查看承诺核心方法):

  1. 在承诺被拒绝时捕获任何错误(调用catch方法)
  2. Istead,如果承诺已解决,则调用then方法。

我没有看到你的正面有什么问题,事实上,它已经使用了承诺:请注意,$http返回一个承诺(看看它的文档)。

app.post中,你必须通过res将一些东西返回给客户端。使用res.send(data or error)

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

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