在express.js中如何在两个javascript文件之间传递参数

3
我正在使用express js,希望能够从一个javascript文件传递参数到另一个。我该怎么做呢?
这两个文件分别是:1. process.js

var WebPageTest = require('webpagetest');
var wpt = new WebPageTest('server address');
var data_url;


exports.process =  function (req, res){

    
    //Running the test
    wpt.runTest(script,{runs: 1},function(err, data) {
        console.log("<----STARTING TEST---->");
        if(err){ console.log(err);}
        data_url = data.data.summaryCSV;
        console.log('-----------');
        console.log(data_url);
        console.log('-----------');
    });
    res.render('index.jade',{par: 'welcome to webpagetest performance, the tests are running in background.'})
};

storedata.js在这里

var request = require('request');
var CSV = require('csv-string');
var moment = require('moment');
var process = require('./process.js');


exports.storedata = function(req,res){

    var URL;
    var loadTime;
    var TTFB;
    var TTFB1;
    var date;
    var date1;
    var date2;
    var db;
    console.log(process.process.data_url);

    request({uri:process.process.data_url,method:'GET'}, function (error,response,body)  {
                //console.log('----@@@@@@----');
                //console.log(response.headers);
                console.log('----@@@@@@----');
                //console.log(response);
                if (error) {
                    console.log('got an error' + error);
                }
                //console.log(response);
                //console.log(body);
                var data = body;
                console.log('here is the body');
                console.log('----@@@@@@----');
                console.log(body);


                CSV.forEach(data, ',', function (row, index) {
                    if (index == 1 || index == 2) {
                        URL = row[0];
                        loadTime = row[1];

                        TTFB = row[2];
                        TTFB1 = parseInt(TTFB);

                        date = new Date(row[59] * 1000);
                        month = date.getUTCMonth() + 1;
                        month = month.toString();
                        var day = date.getUTCDate();
                        day = day.toString();
                        var year = date.getUTCFullYear();
                        year = year.toString();
                        date = year + "-" + month + "-" + day;
                        date1 = new Date(date);
                        date2 = moment(date1).format('YYYY-MM-DD');

                        //console.log(loadTime);
                        var app_re = new RegExp(/^https\:\/\/some-url/);
                        var staging_re = new RegExp(/^https\:\/\/some-url2/);
                        var webuinqa_re = new RegExp(/^https\:\/\/some-url3/);

                        // Writting into the databse for some-url
                        if(app_re.test(URL)){
                        var db = req.db;
                        var collection = db.get('app');
                        collection.insert({
                            "Date": date2,
                            "TTFB": TTFB1,
                            "loadTime": loadTime,
                            "Url": URL
                        }, function (err, doc) {
                            if (err) {
                                res.send("There was a problem adding the information to the database.");
                            }
                        });}

                        //Writting into the database for some-url2
                        if(staging_re.test(URL)){
                            var db = req.db;
                            var collection = db.get('staging');
                            collection.insert({
                                "Date": date2,
                                "TTFB": TTFB1,
                                "loadTime": loadTime,
                                "Url": URL
                            }, function (err, doc) {
                                if (err) {
                                    res.send("There was a problem adding the information to the database.");
                                }
                            });}

                        //Writting into the database for some-url3
                        if(webuinqa_re.test(URL)){
                            var db = req.db;
                            var collection = db.get('webuinqa');
                            collection.insert({
                                "Date": date2,
                                "TTFB": TTFB1,
                                "loadTime": loadTime,
                                "Url": URL
                            }, function (err, doc) {
                                if (err) {
                                    res.send("There was a problem adding the information to the database.");
                                }
                            });}
                        res.render('index', {title: "All the test Results have been added to the databases, Go to localhost/getData to get the graph"});
                        //res.redirect('/getData');
                    }
                });
    });
};

我希望能够将process.js文件中的参数data_url传递到storedata.js文件中,以便我可以在storedata.js文件的request方法中使用data_url的值。


如果同一个HTML页面加载了两个JavaScript文件,那么所有的全局变量或函数都是可用的。如果出现问题,这将使调试变得非常困难。 - Phoenix
1个回答

0
你可以尝试这样做:
在你的storedata.js文件中。
module.exports = function(data_url) {
  // ...
}

process.js 文件中:
var request = require('request');
var CSV = require('csv-string');
var moment = require('moment');
// The path like this assumes storedata.js and process.js
// are in the same folder.
var storeData = require('./storedata');

exports.process =  function (req, res){
  var URL;
  var loadTime;
  var TTFB;
  var TTFB1;
  var date;
  var date1;
  var date2;
  var db;
  var data_url;

  // initiating the test
  var WebPageTest = require('webpagetest');
  var wpt = new WebPageTest('server-address');

  //Running the test
  wpt.runTest(script,function(err, data) {
      //console.log("hello -->",err || data);

      data_url = data.data.summaryCSV;
      console.log('-----------');
      console.log(data_url);
      console.log('-----------');

      // Once your data_url is ready
      storeData(data_url);

更新:

根据您的评论,这里提供了一个可能的解决方案。

var WebPageTest = require('webpagetest');
var wpt = new WebPageTest('server address');
var data_url;

exports.process =  function (req, res){
    //Running the test
    wpt.runTest(script,{runs: 1},function(err, data) {
        console.log("<----STARTING TEST---->");
        if(err){ console.log(err);}
        data_url = data.data.summaryCSV;
        console.log('-----------');
        console.log(data_url);
        console.log('-----------');
    });
    res.render('index.jade',{par: 'welcome to webpagetest performance, the tests are running in background.'})
};

// Create another method that is able to return the saved data.
exports.getSavedDataURL = function() { return data_url; }

然后在storedata.js文件中

exports.storedata = function(req,res){
    var URL;
    var loadTime;
    var TTFB;
    var TTFB1;
    var date;
    var date1;
    var date2;
    var db;
    // 
    var url = process.getSavedDataURL();

    request({uri:url,method:'GET'}, function (error,response,body)  {

只是确认一下。你不觉得你的答案与我所尝试的相反吗?我正在尝试从process.js传递变量到storedata.js,如果我错了,请纠正我。 - Siddharth Sinha
也许我漏掉了什么,请问您能否发布process.js和storedata.js中剩余的代码?我怀疑这与您导出模块的方式有关。至于您的另一个问题,逻辑是var storedata包含您的方法,这就是为什么我使用require(),然后在上面的代码的最后一行触发它,并将变量从process.js传递到storedata.js。这里有一个链接,可能会帮助您理解在node.js中导出模块时文件之间的关系。 - 1cgonza
我已经提供了你要求的所有代码,请告诉我应该去哪里。 - Siddharth Sinha
我明白了,我发现两个问题:1)方法process.process从未实例化。因此,当您在storedata.js中尝试console.log(process.process.data_url);时,这将返回undefined。2)更重要的是,由于您正在对WebPageTest API进行异步调用,因此您尝试调用方法的顺序存在问题。您在storedata.js中的所有内容都取决于您从测试中获得的结果,因此只有在获取WebPageTest的结果后才应运行。出于这个原因,您应该考虑使用回调(如上面的代码)或promises。 - 1cgonza
基本上这两个JS文件是我项目中的两个端点或入口点,首先我调用process.js,经过一段时间(大约15-20分钟)后我调用storedata.js,所以我认为Node的异步性质不会对我造成任何问题。 - Siddharth Sinha
好的,我认为我现在更明白你想做什么了。现在的问题是,在 storedata.js 中你把 process.js 当作一个模块来处理,并且将其导入到 storedata 端点中。目前这样的代码并不能等待“15-20分钟”,即使你之前已经将 process.js 输入到一个端点中了。请看我的更新,可能会有一个解决方案。 - 1cgonza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接