是否可以在Node中按需调用module.exports?

时间:2017-04-28 04:41:23

标签: javascript arrays node.js

我有一个应用程序,我调用API来获取头条新闻并消化JSON并通过套接字将数据发送回客户端。我已经模块化了我的所有代码,并使用不同的文件来保持井井有条。我有index.js文件,我只调用函数来从API获取数据,newsDataFetcher.js是我使用请求模块向API请求数据的地方。我的问题是,由于我所提出的请求是异步的,因此数据不会传递到主服务器文件,因此套接字不会发送任何数据。在对API的请求完成后,我将数据放入一个数组中,该数组位于module.exports文件的newsDataFetcher.js中,以及发出实际请求的函数。因此,由于数组位于module.exports中,因此当我需要newsDataFetcher.js文件中的index.js文件时,会传递一个空数组。所以,这让我想到了一个问题:无论如何都要按需要拨打module.exports""这样它就不会传递一个空数组,只有当数据从API下载完成后它才会传递数组?

index.js

var newsDataFetcher = require('./newsDataFetcher');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var news = []; //array for news headlines and abstracts

app.set('view engine', 'ejs');
app.use(express.static(__dirname + '/views/routes/'));
server.listen(8888);
console.log("Running server on http://localhost:8888 ....");

newsDataFetcher.getNewsData();
news = newsDataFetcher.news;
setInterval(function () {
    newsDataFetcher.getNewsData();
    news = newsDataFetcher.news;
}, 6000000);
setInterval(function () {
    sendAllData()
}, 1000);

function sendAllData() {
    io.sockets.emit('news', news);
}

newsDataFetcher.js档案:

var request = require('request');
var nyTimesApi = "http://api.nytimes.com/svc/topstories/v1/home.json?api-key=" + nyTimesApiKey_DEV;

var news = []; //array for news headlines and abstracts

function getNewsData() {
    request({
        url: nyTimesApi,
        json: true
    }, function (err, res, body) {
        news = body.results;
    });


}



module.exports = {
    getNewsData: getNewsData,
    news: news
}

2 个答案:

答案 0 :(得分:0)

你可以这样做:

// newsDataFetcher.js
module.exports = {
    getNewsData: getNewsData,
    news: function() {
        return news;
    }
}

// index.js
io.sockets.emit('news', newsDataFetcher.news());

答案 1 :(得分:0)

您可以使用单例模式来实现此目的。

class NewsDataFetcher {
    constructor() {
        this.news = [];
    }

    getNewsData() {
         const self = this;
         request({
             url: nyTimesApi,
             json: true
         }, function (err, res, body) {
             self.news = body.results;
         });
    }
}
module.exports = new NewsDataFetcher();

在主页面中。

var newsDataFetcher = require('./newsDataFetcher');
newsDataFetcher.getNewsData(); // to fetch new data;
// To get news data
console.log(newsDataFetcher.news); // will always refer to one instance of news since you are using singleton.