2012-12-10 44 views
1

你好我想短期我的網址如何編寫的NodeJS阻擋功能

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恢復正常鏈接

我應該寫一個新的功能,並通過paramters到併產生新的鏈接並將參數傳遞給另一個函數是否沒有任何簡單的方法?

+0

'working_givelink'在哪裏? – Eric

回答

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

我的參數超過1 kb,我已經將它們傳遞給圖像鏈接,描述,文本和鏈接,並且我已經在.on('end'event –

+0

使用了返回值,您參數的大小無關緊要,您簡單地不能用你所擁有的方式編寫這個函數,你必須安排一個異步函數,當最終結果被知道時調用它 – Alnitak

+0

所以它們必須刪除返回函數它不是必須的, –

0

return不會從你想讓它從返回函數返回。它立即從函數返回。考慮:

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

console.log(foo()) // undefined