我正在构建一个搜索引擎,在客户端POST搜索字符串后查询Twitter和Wiki API服务器端。当我仍然完全在客户端时,对Wiki API的AJAX请求看起来像:
'<p><label for="id_business_name">Business name:</label> <input id="id_business_name" maxlength="100" name="business_name" type="text" /></p>'
现在,我已经实现了一个Node.js Web应用程序,该应用程序从主页上的客户端表单POST获取搜索字符串( index.ejs )。然后,服务器将使用wiki和twitter搜索结果呈现结果页面( results.ejs )。 Twitter API搜索已经使用BoyCook's TwitterJSClient处理。
我想知道从我的服务器执行此完全查询的最佳方法。我一直在环顾四周,找不到简洁的答案。有没有人对此有任何建议?
答案 0 :(得分:1)
以下是基于Jonathan's回复的解决方案:
function wikiSearch () {
var query = querystring.stringify({
action: 'query',
list: 'search',
srsearch: searchString,
srlimit: 10,
srwhat: 'text',
format: 'json'
});
var options = {
hostname: 'en.wikipedia.org',
path: '/w/api.php?' + query
};
var req = https.request(options, function(res) {
if (!res) {
wikiData = "An error occured!";
complete();
};
var body = '';
console.log("statusCode: ", res.statusCode);
res.setEncoding('utf8');
res.on('data', function(data) {
body += data;
});
res.on('end', function() {
wikiData = wikiDataParser( JSON.parse(body) );
complete();
});
});
req.end();
req.on('error', function (err) {
wikiData = "<h2>MediaWiki API is currently down.</h2>";
complete();
})
};
... // complete() is below
根据请求或响应更改 wikiData 变量。
答案 1 :(得分:0)
了解MEAN堆栈。对于初学者来说,通常有人建立了一个模块,你可以用NPM安装,这将简化与api的连接。你可以手动完成,但如果node.js的正式版本可用,则没有意义:
npm install twitter
下面的进入你的主要快递app文件。例如,它被简化了。
//include this....loads the twitter client api app...will make this a breeze
var Twitter = require('twitter');
//your access keys and info to login into the api....fill them.
var client = new Twitter({
consumer_key: '',
consumer_secret: '',
access_token_key: '',
access_token_secret: ''
});
//the below code executes when you hit this path
app.post('/getTweetsYo', function (res, req, data) {
// gets username from ajax post of user data....access via req.data. Passes it to twitter api request
var params = {screen_name: req.data.username };
client.get('statuses/user_timeline', params, function(error, tweets, response){
if (!error) {
console.log(tweets);
// sending the tweets back to the front end!
res.send(tweets);
}
});