简体   繁体   中英

Node.js with Restler to return a value?

This is very early in my Node and JavaScript learning. Ideally, what I am attempting to do is create a small module querying a specific type of rest endpoint and returning a specific feature based on an attribute query. The module is correctly logging out the result, but I am struggling to get the .findById function to return this result. Although aware it has something to do with how the callbacks are working, I am not experienced enough to be able to sort it out yet. Any help, advice and direction towards explaning the solution is greatly appreciated.

// import modules
var restler = require('restler');

// utility for padding zeros so the queries work
function padZeros(number, size) {
    var string = number + "";
    while (string.length < size) string = "0" + string;
    return string;
}

// create feature service object
var FeatureService = function (url, fields) {

    // save the parameters
    this.restEndpoint = url;
    this.fields = fields;
    var self = this;

    this.findById = function (idField, value, padZeroLength) {

        var options = {
            query: {
                where: idField + '=\'' + padZeros(value, padZeroLength) + '\'',
                outFields: this.fields,
                f: "pjson"
            },
            parsers: 'parsers.json'
        };

        var url =  this.restEndpoint + '/query';

        restler.get(url, options).on('complete', function(result){
            if (result instanceof Error){
                console.log('Error:', result.message);
            } else {
                console.log(result); // this log result works
                self.feature = JSON.parse(result);
            }
        });
        return self.feature;
    };
};

var restEndpoint = 'http://services.arcgis.com/SgB3dZDkkUxpEHxu/ArcGIS/rest/services/aw_accesses_20140712b/FeatureServer/1';
var fields = 'nameRiver,nameSection,nameSectionCommon,difficulty,diffMax';

var putins = new FeatureService(restEndpoint, fields);
var feature = putins.findById('awid_string', 1143, 8);
console.log(feature); // this log result does not
//console.log('River: ' + feature.attributes.nameRiver);
//console.log('Section: ' + feature.attributes.nameSection + ' (' + feature.attributes.nameSectionCommon + ')');
//console.log('Difficulty: ' + feature.attributes.difficulty);

So, I sorted out how to insert a callback from a previous thread. It appears it is just passed in as a variable and called with expected parameters. However, I now wonder if there is a better way to accept parameters, possibly in the form of options. Any advice in this regard?

// import modules
var restler = require('restler');

// utility for padding zeros so the queries work
function padZeros(number, size) {
    var string = number + "";
    while (string.length < size) string = "0" + string;
    return string;
}

// create feature service object
var FeatureService = function (url, fields) {

    // save the parameters
    this.restEndpoint = url;
    this.fields = fields;
    var self = this;

    // find and return single feature by a unique value
    this.findById = function (idField, value, padZeroLength, callback) {

        // query options for
        var options = {
            query: {
                where: idField + '=\'' + padZeros(value, padZeroLength) + '\'',
                outFields: this.fields,
                f: "pjson"
            },
            parsers: 'parsers.json'
        };

        var url = this.restEndpoint + '/query';

        restler.get(url, options)
            .on('success', function(data, response){
                var dataObj = JSON.parse(data).features[0];
                console.log(dataObj);
                callback(dataObj);
            })
            .on('fail', function(data, response){
                console.log('Error:', data.message);
            });
        return self.feature;
    };
};

var restEndpoint = 'http://services.arcgis.com/SgB3dZDkkUxpEHxu/ArcGIS/rest/services/aw_accesses_20140712b/FeatureServer/1';
var fields = 'nameRiver,nameSection,nameSectionCommon,difficulty,diffMax';

var putins = new FeatureService(restEndpoint, fields);
putins.findById('awid_string', 1143, 8, function(dataObject){
    console.log('River: ' + dataObject.attributes.nameRiver);
    console.log('Section: ' + dataObject.attributes.nameSection + ' (' + dataObject.attributes.nameSectionCommon + ')');
    console.log('Difficulty: ' + dataObject.attributes.difficulty);
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM