1

嗨,我正在尝试缩短我的网址

function shorutrl(link)
{
var linkpost = JSON.stringify({longUrl:link});.

        var optionslink = {
        host: "www.googleapis.com",
        port: 443,
        method: 'POST',
        path: "/urlshortener/v1/url",
        headers: {
        'Content-Type' : 'application/json'
        }
    };

optionslink.headers['Content-Length']=linkpost.length;
var linkreq = https.request(optionsimg, function(res) {
                res.on('data', function (d) {
                linkdata+=d;
                });
                res.on('end', function (x) {
                try { return JSON.parse(linkdata).id; } catch(e){ return link; }
                });
            }).on('error', function (e) {
                //console.log(e.message);
            });
linkreq.write(optionslink);
linkreq.end();
}

function nonworking_givelink()
{
   return shorutrl(txtlinks[Math.floor(Math.random() * txtlinks.length)]);
}

function working_givelink()
{
   return txtlinks[Math.floor(Math.random() * txtlinks.length)];
}

nonworking_givelink 返回 undefined working_givelink 正常返回链接

我应该编写一个新函数并将参数传递给该函数并生成新链接并将参数传递给另一个函数有没有更简单的方法?

4

2 回答 2

3

你不应该在 node.js 中编写阻塞代码,它违背了系统的设计。

您需要传递一个回调函数,该函数将在您的.on('end', ...)块中使用新 URL 调用。

或者,将其包装到一个新对象中,该对象本身会发出事件,例如:

var https = require('https');
var events = require('events');

function GoogleShortener() {
    events.EventEmitter.call(this);
};

GoogleShortener.super_ = events.EventEmitter;
GoogleShortener.prototype = Object.create(events.EventEmitter.prototype, {
    constructor: {
        value: GoogleShortener,
        enumerable: false
    }
});

GoogleShortener.prototype.shorten = function(link) {

    var self = this;
    var data = JSON.stringify({longUrl: link});

    var options = {
        hostname: 'www.googleapis.com',
        port: 443,
        path: '/urlshortener/v1/url',
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': data.length
        }
    };

    var resp = '';

    var req = https.request(options, function(res) {
        res.setEncoding('utf8');
        res.on('data', function(d) {
            resp += d;
        }).on('end', function() {
            try {
                var id = JSON.parse(resp).id;
                self.emit('success', id);
            } catch (e) {
                self.emit('error', e);
            }
        });
    }).on('error', function(e) {
        self.emit('error', e);
    });

    req.write(data);
    req.end();

    return self;
};

exports.shorten = function(link) {
    return new GoogleShortener().shorten(link);
};

用法:

var g = require('gshort');
g.shorten('http://www.google.com/').on('success', function(link) {
     console.log(link)
});
于 2012-12-10T15:37:37.287 回答
0

return不会从您希望它返回的函数返回。它立即从它周围的函数返回。考虑:

function foo() {
    var bar = function() {
        return "baz";  // This does _not_ return from `foo`! It returns from `bar`
    }
    bar();
}

console.log(foo())  // undefined
于 2012-12-10T16:48:03.103 回答