1
我真的很喜歡用幾乎所有的語言來理解範圍和其他本質的東西。現在我正在構建一個快速應用程序,它接受用戶輸入,然後查詢任意api,然後將其提供給控制檯。爲了處理其餘的API,我正在使用Shred。我知道我可以使用get請求中建立的節點,但由於某種原因,我永遠無法使它工作。用戶向我的應用程序發出以下請求,/ query?query =。這是我現在擁有的。我無法真正描述我在做什麼,所以請閱讀代碼評論。有關範圍,node.js和express的問題
var http = require('http');
var Shred = require("shred");
var assert = require("assert");
exports.query = function(req, res){
//thequery is the string that is requested
var thequery = req.query.query;
var shred = new Shred();
console.log("user searched" + " " + thequery);
console.log();
//The if statement detects if the user searched a url or something else
if (thequery.indexOf("somearbitratyrestapi.com") !== -1){
console.log("a url was searched");
//find info on the url
var thedata = shred.get({
url: "http://somearbitratyrestapi.com/bla/v2" + thequery,
headers: {
Accept: "application/json"
},
on: {
// You can use response codes as events
200: function(response) {
// Shred will automatically JSON-decode response bodies that have a
// JSON Content-Type
//This is the returned json
//I want to get this json Data outside the scope of this object
console(response.content.body);
},
// Any other response means something's wrong
response: function(response) {
console.log("ohknowz");
}
}
});
//I want to be able to see that json over here. How do?
}else{
console.log("another thing was searched");
}
/*
res.render('search-results', {
result: 'you gave me a url',
title: 'you gave me a url'
});
*/
};
我試着這樣做
var http = require('http');
var Shred = require("shred");
var assert = require("assert");
exports.query = function(req, res){
//thequery is the string that is requested
var thequery = req.query.query;
var shred = new Shred();
//I created a variable outside of the object
var myjson;
console.log("user searched" + " " + thequery);
console.log();
//The if statement detects if the user searched a url or something else
if (thequery.indexOf("somearbitratyrestapi.com") !== -1){
console.log("a url was searched");
//find info on the url
var thedata = shred.get({
url: "http://somearbitratyrestapi.com/bla/v2" + thequery,
headers: {
Accept: "application/json"
},
on: {
// You can use response codes as events
200: function(response) {
// Shred will automatically JSON-decode response bodies that have a
// JSON Content-Type
//This is the returned json
//I set myjson to the returned json
myjson = response.content.body
},
// Any other response means something's wrong
response: function(response) {
console.log("ohknowz");
}
}
});
//Then I try to output the json and get nothing
console.log(myjson);
}else{
console.log("another thing was searched");
}
/*
res.render('search-results', {
result: 'you gave me a url',
title: 'you gave me a url'
});
*/
};
對不起,我的問題不好解釋。有人可以幫助或解釋發生了什麼。
是的,我可能會切換到不同的休息api,如https://github.com/mikeal/request,因爲它處理範圍更好。但是你說的是我可以使用.send以某種方式逃避範圍,對吧? – aarocka 2013-02-14 12:52:36
你說「逃避範圍」的方式好像你還沒有理解異步編程如何工作的「啊哈」時刻。這與節點的httpclient vs request與superagent或其他任何事情無關,這就是節點編程的過程。您可以使用函數參數,閉包,回調和流量控制範例(可能通過支持庫,如async.js或promises)。當IO完成時,它不會同步並阻塞,IO的結果顯示在同一範圍內。這完全是一個不同的範例。 – 2013-02-14 18:00:40