我试图在Meteor上使用X射线,但到目前为止没有运气。
以下是我测试的示例(它在基本节点应用上运行良好)
import Xray from 'x-ray';
var xray = new Xray();
xray('http://reddit.com/r/meteor/', '.title',
[{
title: '',
href: '@href'
}]
)
.write('./result.json');
答案 0 :(得分:3)
我希望你从5个月前开始想出来, 我抓住了这个问题并想出了那个方法。
不要使用气氛包,因为它不再维护。
$meteor npm install --save x-ray
(https://github.com/lapwinglabs/x-ray)
然后在服务器端创建一个Meteor.method并在客户端调用它。
(https://docs.meteor.com/api/methods.html)
// Server Side
import Xray from 'x-ray'
Meteor.methods({
scrap:function(){
var x = Xray();
console.log('Is scrapping');
x('http://google.com', 'title')(function(err, title) {
console.log(title) // Google
})
}
});
然后
// Client Side
Meteor.apply('scrap', function(error, result) {
console.log(error, result);
console.log('Scrap is bussy');
})
干杯
答案 1 :(得分:1)
上一篇文章中的代码确实调用了服务器端的X射线功能,但没有将结果返回给客户端。
使用async / wait和promises(ES7),您可以将结果从服务器返回给客户端:
method.js(server):
import { Meteor } from 'meteor/meteor';
import Xray from 'x-ray';
Meteor.methods({
async 'scrape.test'() {
let x = Xray(),
scraper;
function scrap() {
return new Promise((r, e) => {
x('http://google.com', 'title')(function(err, title) {
if (err) e(err);
if (title) r(title);
});
});
}
try {
return await scrap();
} catch (error) {
throw new Meteor.Error('500', error);
}
}
});
client.js:
Meteor.call('scrape.test', (error, result) => {
if (error) console.log('error', error);
console.log('result', result);
});
干杯