【发布时间】:2017-11-15 02:16:20
【问题描述】:
我在 Nodejs 中创建了一个实时应用程序,我正在使用 socket.io 向给定频道中的所有连接用户广播数据。我正在对 API-url 进行 http 调用,例如:http://example.com/api/token=tokenumber 每 1 秒并获取新的 json 数据。这些数据在推送到客户端查看之前需要进行算术运算(为了进行算术运算,应用程序需要连接到数据库,例如:mongo或mysql并获取将用于计算的数据)。
例如-工作流
step 1) make http call [received data x=80, y=90]
step 2) connect to db [received data a=10, b=20]
step 3) do calculation [finalval = x*a + y*b]
step 4) push data to view
在这里,我们连接到 db,因为这些 a 和 b 变量是动态的,并且由管理员使用某种控制面板进行设置。
问题
目前,我每 1 秒连接一次 db,因为我每 1 秒进行一次 http 调用。但我很确定 a 和 b 的值将是相同的,直到任何管理员用户登录到控制面板并更改这些值。 浪费资源,我相信我通过每 1 秒连接到 db 并获得相同的不变值来大量使用资源
如何优化它?如何确定数据库表中是否发生任何更改以及是否发生任何更改,如何获取新值并使用某种内存缓存存储它,以便通过不连接来节省时间和资源值不变时发送到数据库。
需要注意的是,当数据库表中的值发生变化时,它们应该立即反映,因为应用程序是实时的。
我知道每隔 1 分钟或 5 分钟检查一次数据库表以查明值是否已更改以及取决于缓存的新值的解决方案。但这意味着如果我在 t0 更改 a 和 b 的值,最坏的情况是 1 或 5 分钟后更新视图,一旦执行到 db,我不想要这个。
更新
所以,我有我之前解释过的代码:我正在尝试将从 db 中提取的值保存到某个变量 X。但在下一次调用时,它 被设置为未定义,因为每 N 秒调用一次函数 test .但与 db 的连接只发生一次。
我只会在应用程序运行时调用 DB,并且只要管理员对 DB 进行任何更改并点击提交按钮,我就会再次调用它。
我不想进行任何数据库调用,但在此之前使用从 Db 中提取的相同值。我尝试将它存储在一个变量中,但是一旦发生下一次调用,同一个变量就会设置为未定义。
代码
//requiring model products
var Product = require('./models/product');
//Here function is an async callback
Product.find(function (err, products) {
if (err) return console.error(err);
console.log("callback function results: "+products);
//I am passing data to test function once I receive the data from MongoDB
test(products);
});
//This function is called every N seconds
function test(val) {
//Here I am trying to store mongoDB data to variable hello
var hello = val;
//This prints only once when data from mongodb is recieved then next very second its set to undefined.
console.log("stored value from db: "+hello);
http.get("api url", function(res) {
var body = '';
res.on('data', function(data) {
body += data;
});
res.on('end', function() {
var parsed = JSON.parse(body);
var dataArray = [];
//I need access to mongoDB data right here and use it in some arithmetic operation
var p1 = parsed.data.example1 + hello[0].price;
//finally push data into array
dataArray.push(p1);
console.log(dataArray);
//pushing to socket channel - live
nsp.emit('live', dataArray);
});
});
}
型号
var mongoose = require('mongoose');
mongoose.connect('mongodb://username:pswd....');
var db = mongoose.connection;
//Product Schema
var ProductSchema = mongoose.Schema({
name:{
type: String
},
price:{
type: Number
},
unit:{
type:Number
},
type:{
type:String
}
});
var Product = module.exports = mongoose.model('Product', ProductSchema);
【问题讨论】:
-
'需要注意的是,当数据库表中的值发生更改时,它们应该立即反映,因为应用程序是实时的。'我想你回答了你的问题,那么问题是什么?
-
你的数据库是什么?
-
在您的应用启动时从数据库中读取 a 和 b,并将它们存储在一个变量中。然后仅在从管理端更改值时更新它们。
-
@farhadamjady 但要知道值是否已更改,我需要每秒连接到 db 并检查是否正确?如果值一开始没有改变,我不想简单地连接到数据库
-
@arvinkarimi 它的 mongoDB
标签: node.js database real-time