1

我真的很不擅长理解几乎所有语言中的范围和其他类似性质的东西。现在我正在构建一个快速应用程序,它接受用户输入,然后查询任意 api,然后将其提供给控制台。为了处理其余的 api,我使用了 shred。我知道我可以使用 get 请求中内置的节点,但由于某种原因,我永远无法让它工作。用户向我的应用程序 /query?query= 发出以下获取请求。这就是我现在所拥有的。我无法真正描述我在做什么,所以请阅读代码注释。

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' 
    });
 */
};

很抱歉对我的问题的解释不好。有人可以帮忙或解释发生了什么。

4

1 回答 1

0

因此,您认为您需要将数据移出嵌套范围,但事实恰恰相反。在您可以访问上游 JSON 响应的嵌套范围内,您需要访问该res对象并发送它:

myjson = response.content.body
res.send(myjson);

但是,从长远来看,您需要做更多的节点教程,并专注于如何使用回调来避免深度嵌套的函数范围。

于 2013-02-14T02:54:17.973 回答