我正在制作一个供个人使用的小型 Node.js 应用程序,它使用他们的匿名 API 将上传到我的 Twitter 帐户(pic.twitter.com 链接)的图片侧载到 imgur,用新获得的 imgur 替换 pic.twitter.com 链接链接并将他们的推文保存到磁盘。这是执行此操作的代码位:
var
jsdom = require( 'jsdom' )
, request = require( 'request' )
, t_pic = /http:\/\/pic.twitter.com\/([a-z0-9]+)/gi;
function rehostImage( match ) {
request( match, function( e, r, b ) {
if ( e ) throw e;
jsdom.env(
{
html: b,
scripts: ['http://code.jquery.com/jquery-1.7.2.min.js']
},
function( err, window ) {
var $ = window.jQuery;
request.post(
'http://api.imgur.com/2/upload.json',
{
key: 'gh10z9DFZ009876E342dfsfd34234dszSD65XRV5',
image:$( '.twimg' ).find( 'img' ).attr( 'src' )
},
function( data ) {
return data.upload.links.original;
});
});
});
}
var tweets = [], i = 0;
/* code to GET twitter page using "request" goes here similar to rehostImage */
/* same jsdom boilerplate as in rehostImage function goes here to get
the jQuery handle on the page DOM. Once we get "$"... */
$( '.tweet-text' ).each( function() {
i++;
tweets[ i ] = $( this ).html();
if( tweets[i].match( t_pic ) ) { tweets[i].replace( t_pic, rehostImage ); }
});
代码试图做的很简单:
- 获取我的推特页面
- 解析任何 pic.twitter.com 链接的每条推文
- 获取该页面,遍历 DOM,找到图像 URL 并通过他们的匿名 API 上传到 imgur
问题是这里的正则表达式替换tweets[i].replace( t_pic, rehostImage )
。replace
将函数作为第二个参数,其返回值用于替换匹配的字符串;在这种情况下,上传后的最终 imgur URLdata.upload.links.original
替换了我推文中的 pic.twitter.com URL,然后我将其保存到本地磁盘。
当一切都通过回调异步发生时,我如何才能rehostImage
返回到正则表达式替换?data.upload.links.original
通常的方法是进行最后的操作,即正则表达式替换,并将其作为可以在之后运行的回调传递,data.upload.links.original
但由于正则表达式替换是内联发生的,我不知道如何在这里应用该方法。
任何指针?