全局变量在NodeJS中不起作用未定义

时间:2019-01-02 07:20:09

标签: javascript node.js

是否可以在node.js函数中定义全局变量?

我想在其他函数中使用ko变量(在getNumbers函数中声明)

function getNumbers(callback) {
    result = cio.query("SELECT numbers FROM rooms WHERE durum='1'", function (err, result) {
        if (err) throw err;
        callback((result.length > 0) ? result[0].numbers : "");
    });
}

var ko = getNumbers(function (result) {

console.log(result)
});


 var zo = ko;

“未定义”

46,16,55,12,74,48,77,42,4,29,14,81,13,35,39,85,7,54,27,66,41,9,17,82,31,21,57,79,62,56,11,49,3,33,64,8,83,88,61,18,58,63,51,90,22,71,67,69,75,6,2,34,30,25,38,28,68,5,50,15,87,19,65,36,45,24
C:\wamp64\www\node\st\rooms.js:497
        var datadad = zo[Math.floor(Math.random()*zo.length)];
                                                     ^

TypeError: Cannot read property 'length' of undefined
    at sayiver (C:\wamp64\www\node\st\rooms.js:497:54)
    at Timeout._onTimeout (C:\wamp64\www\node\st\rooms.js:513:5)
    at ontimeout (timers.js:436:11)
    at tryOnTimeout (timers.js:300:5)
    at listOnTimeout (timers.js:263:5)
    at Timer.processTimers (timers.js:223:10)

3 个答案:

答案 0 :(得分:2)

可以,而且您的方法正确。

未定义public class MilitaryPerson { public string ImageUrl { get; set; } public string MilitaryNumber { get; set; } public string FirstName { get; set; } public string FatherName { get; set; } public string LastName { get; set; } public string TitleName { get; set; } public string MainCategoryName { get; set; } public string CategoryTypeName { get; set; } public string RegimentName { get; set; } public string Address { get; set; } public string ChemiseSize { get; set; } public string SuitSize { get; set; } public bool WithWeap { get; set; } public string WithWeapon { get; set; } public int? ForceID { get; set; } public bool IsImported { get; set; } } //JS Code var Result = []; var ExcelToJSON = function () { this.parseExcel = function (file) { var reader = new FileReader(); reader.onload = function (e) { var data = e.target.result; var workbook = XLSX.read(data, { type: 'binary' }); workbook.SheetNames.forEach(function (sheetName) { // Here is your object var XL_row_object =XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]); var json_object = JSON.stringify(XL_row_object); if (JSON.parse(json_object).length > 0) { Result = JSON.parse(json_object); Result = Result.splice(1, Result.length); //console.log(Result); } } (和ko)的原因是因为您没有从zo返回任何信息,而是使用了回调。

要么处理涉及回调内部变量的逻辑,要么使用getNumbersasync

请参阅:Asynchronous JavaScript

答案 1 :(得分:2)

这是您的代码的快速修复。如前所述,由于您没有从函数中返回此值,因此必须在回调内部处理此逻辑。同样,即使您返回一个值,ko仍将是未初始化的(当您尝试将其值分配给zo时),因为您使用异步操作从DB中获取了一些东西,并且您不必等待数据就可以分配。

function getNumbers(callback) {
    result = cio.query("SELECT numbers FROM rooms WHERE durum='1'", function (err, result) {
        if (err) throw err;
        callback((result.length > 0) ? result[0].numbers : "");
    });
}

var ko;
var zo;    

getNumbers(function (result) {
  ko = result;
  console.log(result);
  zo = ko;
});

下面是一个代码示例,其中zo仍将是未定义的(假定功能当然不是同步的):

function getNumbers(callback) {
    result = cio.query("SELECT numbers FROM rooms WHERE durum='1'", function (err, result) {
        if (err) throw err;
        callback((result.length > 0) ? result[0].numbers : "");
    });
}

var ko;

getNumbers(function (result) {
  ko = result;
  console.log(result);
});
var zo = ko; //Not good!

答案 2 :(得分:0)

您可以使用这种方法:

global.ko; // Declaration of the global variable - undefined
global.ko = 5; // Global variable initialized to value 5.

您可以这样访问:

var myNumber = global.myNumber;
相关问题