Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js可以';t访问另一个javascript文件中的变量_Javascript_Node.js - Fatal编程技术网

Node.js可以';t访问另一个javascript文件中的变量

Node.js可以';t访问另一个javascript文件中的变量,javascript,node.js,Javascript,Node.js,这是我的第一个javascript文件,名为search.js,用于通过twitter帖子进行查询 var Twit = require('twit'); var config = require('./config') var T = new Twit(config); var params = { q: '#stackOverflow', count: 1 } var response = null; T.get('search/tweets', para

这是我的第一个javascript文件,名为search.js,用于通过twitter帖子进行查询

var Twit = require('twit');
var config = require('./config') 

var T = new Twit(config); 

var params = {

   q: '#stackOverflow',

   count: 1

} 


var response = null; 

T.get('search/tweets', params, searchedData); 


function searchedData(err, data, response) {
   response = data
   console.log(response) //prints the post
   return response;

} 
twitter帖子存储在最后一个函数返回的“response”变量中。当我打印响应变量时,它会正确地打印帖子。我需要访问运行服务器的index.js中的变量

这是我的index.js文件:

const mySearch = require('./search.js');
const express = require('express');

const app = express();

app.get('/', function(req, res) {
    res.send('Hello World');
})

app.listen(3000, function(){
    console.log("Server started on port 3000...");
    console.log(mySearch.response)//prints 'undefined'
})
有人能帮我吗?我试着在网上查找,但我仍然无法将这些片段组合起来


谢谢

您必须在
search.js
文件中导出模块。执行此操作的代码如下所示:

module.exports = {
  response: response
};
module.exports = {
  function getData() {
    return new Promise(function (resolve, reject) {
      var response = null; 

      T.get('search/tweets', params, function (err, data, response) {
        if (err) {
          reject(err);
        }
        else {
          response = data
          console.log(response) // prints the post
          resolve(response);
        }
      }); 
    });
  }
}
但是,如评论中所述,对于一个功能齐全的模块,您需要导出一个承诺,例如,考虑到从twitter获取数据是一个异步操作。为此,请创建如下函数:

module.exports = {
  response: response
};
module.exports = {
  function getData() {
    return new Promise(function (resolve, reject) {
      var response = null; 

      T.get('search/tweets', params, function (err, data, response) {
        if (err) {
          reject(err);
        }
        else {
          response = data
          console.log(response) // prints the post
          resolve(response);
        }
      }); 
    });
  }
}
您可以通过以下方式让他们访问检索到的推文:

mySearch.getData().then(function (response) {
  console.log(response); // Data retrieved
}).catch(function (error) {
  console.log(error); // Error!
});
为响应对象创建一个承诺,并将其导出

您的
T.get('search/tweets',params,searchedData)
是异步的。因此,您不能真正从
searchedData
函数的范围导出变量。您可以直接在主服务器文件中导入twit模块。或者,您可以创建一个承诺,可以先导出,然后在主文件中导入。以下是您如何使用承诺来实现这一目标:

var Twit = require('twit');
var config = require('./config') 

var T = new Twit(config); 

var params = {
   q: '#stackOverflow',
   count: 1
} 

var postPromise = new Promise((resolve, reject) => {
     T.get('search/tweets', params, (err, data) => {
         if (err) {
              reject(err);
         } else {
            resolve(data)
         }
     }); 
});

module.export.postPromise = postPromise;
然后,您可以将此承诺导入index.js文件,并执行以下操作:

const getPosts = require('./search.js').postPromise;
const express = require('express');

const app = express();

app.get('/posts', function(req, res) {
      getPosts.then(posts => res.status(200).json(posts));
})

...
您应该使用回调链接来正确获取tweet

const mySearch = require('./search.js');
const express = require('express');

const app = express();

app.get('/', function(req, res) {
    res.send('Hello World');
})

app.listen(3000, function() {
    console.log("Server started on port 3000...");
    //console.log(mySearch.response)//prints 'undefined'

    mySearch.getTweets(function(err, data, response) {
        console.log(data)
    });
})

如果要使用文件之外的任何函数,请使用模块。导出。 使其可用

Search.js

index.js


这是第一步,但它不起作用,因为填充
响应
变量的代码是异步的。你们都是对的!编辑了这篇文章,完全回答了他的问题,谢谢你的提示!您在哪里调用了searchedData函数?它应该在你的应用程序中调用。listen,你应该能够在那里捕获变量中的返回值。
const mySearch = require('./search.js');
const express = require('express');

const app = express();

app.get('/', function(req, res) {
    res.send('Hello World');
})

app.listen(3000, function(){
    console.log("Server started on port 3000...");
    var params = {
        q: '#stackOverflow',
        count: 1
     } 

    mySearch.getTweet(params,function(error,response){
        error ? console.log(error) : console.log(response);
    });
});