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

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

我试图向将写入文件的节点函数发出请求,但我不确定将成功或失败返回给angular的最佳方法。设置如下所示:

//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
    做什么?