0

全体的なアイデアは、ローカル操作のために UNIX ソケットを介して LXD RESTful API を使用することです。次のコードは、エラーが発生した 2 または 3 ごとに 1 回実行されます。node.js に関連するのか、lxd api に関連するのかはわかりません。

エラーのある出力

リクエストの問題: write EPIPE { [エラー: write EPIPE] code: 'EPIPE', errno: 'EPIPE', syscall: 'write', address: undefined }

コード:

/*
Adapted from 
http://rapiddg.com/blog/calling-rest-api-nodejs-script
*/
var querystring = require('querystring');
var http = require('http'), req, response;

var socketUSD='/var/lib/lxd/unix.socket';

function RestConsume(){ };

RestConsume.prototype._doRequest_=function(httpMethod,pathAPI,data,fnCallBack){
        var dataString = JSON.stringify(data);
        var headers = {};

        if (httpMethod==='GET'){
            pathAPI+='?'+querystring.stringify(data);

        }else{
            headers = {
              'Content-Type': 'application/json',
              'Content-Length': dataString.length
            };
        }
        var options = {
                socketPath: socketUSD,
                path: pathAPI,
                method: httpMethod,
                headers: headers
            };

        var req=http.request(options, function (res){
            res.setEncoding('utf-8');

            var resultString="";

            res.on('data',function(data){
                resultString +=data;
            });//end res.on('data')//

            res.on('end',function(){
                console.log(resultString);
                var responseObject = JSON.parse(resultString);
                fnCallBack(resultString);
            });
        });

        req.write(dataString);
        req.end();
        req.on('error', function(e) {
            console.log('Haciendo '+httpMethod);
          console.log('problem with request: ' + e.message);
          console.log(e);
        });
};
RestConsume.prototype.doGet=function(pathAPI,data,fnCallBack){
        return this._doRequest_('GET',pathAPI,data,fnCallBack);
};
RestConsume.prototype.doPost=function(pathAPI,data,fnCallBack){
        this._doRequest_('POST',pathAPI,data,fnCallBack);
};
RestConsume.prototype.doPut=function(pathAPI,data,fnCallBack){
        this._doRequest_('PUT',pathAPI,data,fnCallBack);
};
RestConsume.prototype.doDelete=function(pathAPI,data,fnCallBack){
        return this._doRequest_('DELETE',pathAPI,data,fnCallBack);
};
var obj=new RestConsume();
obj.doGet("/1.0/containers/pc01/logs",{},function(data) {
    console.log('get Respuesta:\r\n' + data);
  });
4

1 に答える 1

1

修正済み:ドキュメントを使用してください。

より正確には、次の行です。

http.request(options, callback).end();

これで、コードは魔法のように機能します。

于 2015-10-26T23:25:58.697 に答える