nodejs模块间共享数据
发布于 2 年前 作者 lanfengZhou 4100 次浏览 来自 问答

现在遇到一个问题,在一个模块中读取数据库数据保存到一个对象中,使其他模块能够通过exports访问到它,但如何让这个模块的对象能够像java中的static变量一样,就是当一个模块对该对象操作时,其他模块再访问这个变量时也能够得到更改后的这个对象,求各位解答?下面是我的一个模块的代码, var express=require(‘express’); var query= require(’…/lib/db/mysql’); var listMap={}; var init=function(){ query(‘select number,state from device’,function(err,vals,fileds){ if(err){ console.log(err); }else{ vals.forEach(function(item,index,arr){ //console.log( item.constructor); listMap[index]=item; }); } }) } module.exports.init=init; module.exports.listMap=listMap;

7 回复

t1.js

let a = { ttt:123 }
module.exports.a = a;

t2.js t3.js

let a = require('./t1');

function printa(){
  console.log(a);
}

function seta(t){
  a.a[t]=t;
}

module.exports = {
  printa,
  seta,
}

test

t2 = require('./t2')
t3 = require('./t3')

t2.printa()
//{ a: { ttt: 123 } }

t3.printa()
//{ a: { ttt: 123 } }

t2.seta('aaaa')
t3.printa()
//{ a: { ttt: 123, aaaa: 'aaaa' } }

意思是需要被更改数据的模块,在其他模块中都要事先加载,同时也需要暴露能够更改的接口?,我怎么感觉你这样写这么麻烦呢,seta和printa直接放在t1模块中不行吗?

贴段代码,求指点:

var express=require('express');
  var query= require('../lib/db/mysql');
  function MapList(){
	  global.listMap={};
	  this.init=function(){
		  query('select number,state from device',function(err,vals,fileds){
			  if(err){
				  console.log(err);
			  }else{
				  vals.forEach(function(item,index,arr){
					  //console.log( item.constructor);
					  listMap[item.number]=new Array(item.state.toString());
				  });
			  }
		  })
	  };
	  this.getData=function(){
		  return JSON.stringify(listMap);
		  //return listMap;
	  }
	  this.updateData=function(key,value){
		 listMap[key]=value;
	  }
  }
  module.exports=MapList;

在其他模块中我修改listMap这个对象,

  var MapList=require('./rfidlist');
  var mapList1=new MapList();
   mapList1.updateData("7","11112");
   console.log(mapList1.getData());

直接用redis阔以吗

@nnliang 没尝试用这个,应该不会像操作mysql数据库那样需要很长时间吧

@lanfengZhou redis 把你要的数据缓存在内存里,拿和存都比较容易的

@lanfengZhou 你要考虑到,如果多个模块同时操作这个对象中的同一个key的情况

回到顶部