在我的代码的开头,我创建了一个全局变量DT的新实例,但是当我尝试在方法中重新分配一个新对象时,我的全局变量不会改变。
const functions = require('firebase-functions');
const DecisionTree = require("decision-tree")
var firebase = require('firebase-admin');
const cors = require('cors')({origin: true});
......
var boards;
var dt;
var training_dat;
var class_name = "NextMove";
var features = ["C1", "C2", "C3", "C4", "C5", "C6", "C7", "C7", "C9"];
ref.once('value').then(function(snap) {
boards = snap.val(); // query all data
training_data = new Array();
for(var B in boards){
training_data.push(boards[B]);
}
dt = new DecisionTree(training_data, class_name, features);
// HERE dt is a model with 500 rows.
});
exports.train = functions.https.onRequest((request, response) => {
.....
dt=new DecisionTree(new_training_data, class_name, features);
//HERE dt is a model with 1000 rows
response.send({output: "Training"});
});
exports.DOSOMETHING = functions.https.onRequest((request, response) => {
// if i call dt here it is still a model with 500 rows.
response.send({output: "Done"});
});
所以我开始我的脚本,我得到的是dt是500行。如果我打电话给“火车”,我会发现它是1000行。但是当我调用“DOSOMETHING”时,我的变量dt仍然有500行,就像先前的方法不会影响他一样。
对不起,这可能听起来很愚蠢,但我无法弄清楚;
Node.js不会将使用var声明的变量放入全局范围。 (see related Question)。
虽然您可以通过在不使用dt
关键字的情况下为var
分配值来创建全局,但在严格模式下会出错。您可以尝试为global.dt
而不是dt
分配值,以创建和访问没有严格模式错误的全局值。
每个需要多次模块的Node.js documentation总是返回在首次需要文件时创建的相同缓存的module.exports
对象。因此,您还应该能够在应用程序中访问公共名称空间对象的任何地方需要一个空的js文件,例如appdata.js
。