【问题标题】:lokijs storing in filesystem not in in-memeorylokijs 存储在文件系统中而不是内存中
【发布时间】:2018-10-07 10:38:13
【问题描述】:

我从网上尝试了以下基本示例;

var loki = require('lokijs');
var lokiDatabase = new loki('oops.json');

var collection = lokiDatabase.addCollection('props',{
    indices: ['name']
});


function hello() {
    var insertjson = {name:'Ram'};
    collection.insert(insertjson);
    lokiDatabase.saveDatabase();
    var select = collection.findOne({name:'Ram'});
    console.log('select response:'+ select.name);
 }

hello();

我可以使用findOne 方法获得输出;

但在这里,问题是;正如教程所说,LokiJS 是一个内存数据库;其中,我可以看到所有插入和更新都显示在 oops.json 文件中。

我们在哪里存储/从内存中存储?

我是不是理解错了概念?

【问题讨论】:

  • 这在调用 saveDatabase 方法时是可取的,你不觉得吗?我的意思是,如果您不将数据库保存在文件中,它仍然可以在内存中工作,对吧?
  • @gorhawk,从某种意义上说,在内存中,我们不会将记录保存在文件中,对吧?它应该在 RAM/某个地方!!!
  • 只是不要调用 saveDatabase 方法。您的 findOne 查询仍然有效。这就是你想要的,不是吗?
  • 如果我不调用 saveDatabase 方法会怎样,它会保存在内存中,所以每当我调用 findOne() 时,它会一直返回数据吗?
  • 是的,但它不是服务器,因此数据库仅在您的程序运行期间持续存在,具体取决于环境(例如,我在浏览器环境中使用过它,这意味着只要页面已打开)抱歉,我真的不知道您对这些概念的熟悉程度,所以我不知道如何回答。

标签: lokijs


【解决方案1】:

enter image description here

//lokirouter.js
const db=require('./lokidb')
const router=require('express').Router
class Erouter{
static get(){
router.get("/",(req,res)=>{
db.loadDatabase({},function(){
    try{
    const data=db.getCollection('items').find({})
    res.send(data).status(200)
    }
    catch(r){
        res.status(500).send(`${r}`)
    }
})
})
router.post("/",(req,res)=>{
db.loadDatabase({},()=>{
    try{
    const data=db.getCollection('items').insert(req.body.criteria)
    db.saveDatabase(data)
    db.save(data)
    res.send(data).status(200)
    }
    catch(r){
    res.status(500).send(`${r}`)
    }
    })
    })
return router
}}
module.exports=Erouter

//lokidb.js
var loki=require('lokijs')
var db = new loki('loki.db');
var items = db.addCollection('items');
module.exports=db

//lokiapp.js
const lokirouter=require('./lokirouter')
const express =require("express")
const bodyParser = require('body-parser')
const app=express()
const db=require('./lokidb')
const port=8000;
app.listen(port)
console.log("Server Started"+ " "+port)
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())
app.use("/",lokirouter.get())

【讨论】:

  • 这是使用get和post api的简化方法
【解决方案2】:

Lokijs 是一个文档驱动的数据库,除了不必只存储一个 json 文件的记录外,还可以存储在本地数据库文件中,例如创建 local_database.db。 正如前面提到的答案,您必须使用邮递员运行它。 当您以 json 格式在请求正文中插入记录时 ex:{ "criteria":{"name":"jason"} } 它将被插入到 local_database.db 文件中。类似地检索您可以调用 get api 的记录。因为要查找特定记录,您可以使用 findOne({name:"jason"})。

【讨论】:

  • 将数据库存储在文件系统中;在生产环境中也那么安全吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 2011-06-24
  • 2022-08-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
相关资源
最近更新 更多