Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用来自两个文件/进程的单个Mongoose数据库是否安全?_Javascript_Node.js_Multithreading_Mongodb_Mongoose - Fatal编程技术网

Javascript 使用来自两个文件/进程的单个Mongoose数据库是否安全?

Javascript 使用来自两个文件/进程的单个Mongoose数据库是否安全?,javascript,node.js,multithreading,mongodb,mongoose,Javascript,Node.js,Multithreading,Mongodb,Mongoose,我一直在开发一个服务器和一个推送通知守护进程,它将同时运行并与同一个数据库交互。这背后的想法是,如果一个发生故障,另一个仍将发挥作用 我通常使用Swift,但对于这个项目,我将它写在节点中,用作我的数据库。我已经创建了一个helper类,我将它导入到我的server.js文件和我的notifier.js文件中 const Mongoose = require('mongoose'); const Device = require('./device'); // This is a Schema

我一直在开发一个服务器和一个推送通知守护进程,它将同时运行并与同一个数据库交互。这背后的想法是,如果一个发生故障,另一个仍将发挥作用

我通常使用Swift,但对于这个项目,我将它写在节点中,用作我的数据库。我已经创建了一个helper
,我将它导入到我的
server.js
文件和我的
notifier.js
文件中

const Mongoose = require('mongoose');
const Device = require('./device'); // This is a Schema

var uri = 'mongodb://localhost/devices';

function Database() {
    Mongoose.connect(uri,  { useMongoClient: true }, function(err) {
        console.log('connected: ' + err);
    });
}

Database.prototype.findDevice = function(params, callback) {
    Device.findOne(params, function(err, device) { 
        // etc...
    });
};

module.exports = Database;
然后分别从
server.js
notifier.js
创建对象并查询数据库:

const Database = require('./db');
const db = new Database();

db.findDevice(params, function(err, device) {
    // Simplified, but I edit and save things back to the database via db
    device.token = 'blah';
    device.save();
});
这样做安全吗?在使用Swift(和Objective-C)时,我总是关心如何确保线程安全。这是一个问题吗?我应该担心比赛条件,同时修改相同的文件吗

还有一个额外的问题:Mongoose如何在文件(或进程)之间共享连接。例如
Mongoose.connection.readyState
从不同的文件返回相同的内容

简单的答案是“足够安全。”

答案很长,需要了解什么样的一致性保证您的系统需要,您是如何配置MongoDB的,以及是否存在任何分片或复制

对于后者,你会想,也许还会偷看


回答这些问题的一个好方法是测试场景,即使您认为自己已经找到了答案:用虚假数据和事件敲打您的系统副本,看看发生的情况是否正常。

MongoDB是一个完全独立的服务,通常运行在它自己的专用机器上。这与“在不同的过程中打开文件”完全不同。这是一个“数据库”,它们是为同时作用于它们的多个进程而创建的。所以“线程安全”实际上与主题无关。对于并发操作,您使用的编写方法是否安全?这是一个完全不同的问题,完全取决于您实现的代码。但是你在这里提出的一般性问题表明你对什么是数据库缺乏了解,你应该进行研究。@NeilLunn现在我已经证明了我的无知,你有什么链接或资源建议可以更详细地解释MongoDB/Mongoose吗?我整个星期都在阅读文档,并尽可能多地回答问题,但很明显,这并没有让我达到我应该达到的程度,正如我所指出的那样,你似乎更难以理解“数据库”的基本概念和作用。简言之,它与“文本文件”有很大不同。如果您需要一个解释,那么如何搜索诸如“数据库如何工作?”或类似主题之类的内容呢。这些答案通常包括“书籍”,并不适合任何有意义的回答。@NeilLunn dude,我知道这不是“文本文件”。你不必如此居高临下。我已经读了好几遍关于写作关注的文章,但我担心这是你说的。真实的例子可能会获得更多的信息。感谢您的链接。下面是一系列测试的第一篇文章,这些测试针对正在进行网络分区的小型MongoDB集群:这将向您介绍一些可能的故障场景以及如何思考这些问题。