簡體   English   中英

Node.js 無法訪問另一個 javascript 文件中的變量

[英]Node.js Can't access variable in another javascript file

這是我的第一個 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 帖子存儲在最后一個函數中返回的“響應”變量中。 當我打印響應變量時,它會正確打印帖子。 我需要在運行服務器的 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'
})

誰能幫幫我嗎? 我嘗試在網上查找,但我仍然無法將這些碎片拼湊在一起。

謝謝!

為響應對象創建一個承諾並將其導出。

你的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文件中導入這個 promise 並執行如下操作:

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));
})

...
module.exports.getTweets = function(callback) {
    var Twit = require('twit');
    var config = require('./config')

    var T = new Twit(config);

    var params = {

        q: '#stackOverflow',

        count: 1

    }

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

您應該使用回調鏈來正確獲取推文。

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)
    });
})

當您想使用文件外的任何函數時,請使用module.export 使其可用。

搜索.js

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

var T = new Twit(config);

var getTweet = function (params, callback) {
    T.get('search/tweets', params, function (err, data, response) {
        if (error) {
            console.log(error);
            callback(error,null);
        } else {
            callback(null,data);
        }
    });
}

module.exports.getTweet = getTweet;

索引.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...");
    var params = {
        q: '#stackOverflow',
        count: 1
     } 

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

您必須在search.js文件中導出模塊。 這樣做的代碼如下所示:

module.exports = {
  response: response
};

但是,正如評論中所述,對於一個功能齊全的模塊,您需要導出一個 Promise,例如,假設從 twitter 獲取數據是一個異步操作。 為此,請創建如下函數:

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!
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM