繁体   English   中英

NeDB 不使用 Express.JS 保存到文件中

[英]NeDB not saving into file with Express.JS

我正在为自己的密码管理器编写批量导入 function 并且遇到了一个问题。

有一组要导入的密码,我正在使用forEach()方法遍历要导入的每个密码。 我称插入 function 并且一切都停止了。 没有错误,没有回调,没有保存到文件。 这是我的代码:

const express = require('express')
const app = express()
const { encrypt, decrypt } = require('./crypto')
const Datastore = require('nedb')

app.post('/bulkimport', checkAuthenticated, (req, res) => {
  var passwords = JSON.parse(req.body.passwords)
  var dbForUser = new Datastore('./passwords/' + req._passport.session.user + '.db')
  passwords.forEach(password => {
    function doc(code, link, name, password) {
      this.code = code
      this.link = link
      this.name = name
      this.password = password
    }
    var entry = new doc(password.name, password.url, password.username, password.password)
    console.log(entry)
      console.log('before insert') // gets logged
      dbForUser.insert(entry, function(err, doc) {
        console.log('after insert') // doesn't get logged
        if (err) return res.status(500).send()
        console.log(doc)
      })
  });
})

我正在使用的中间件:

app.use(bodyParser.json())
  app.use(express.urlencoded({ extended: false }))
  app.use(flash())
  app.use(session({
    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: false
  }))
  app.use(passport.initialize())
  app.use(passport.session())
  app.use(methodOverride('_method'))

谢谢您的帮助!

我看到两个问题。 根据db.insert文档,db.insert 采用普通的 JS object,并且您在forEach中调用res.send() (这可能导致cannot set headers after they are sent 。您也可以跳过解析正文通过为此使用模块。

const express = require('express')
// added
const bodyParser = require('body-parser')
const app = express()
const { encrypt, decrypt } = require('./crypto')
const Datastore = require('nedb')

// added
app.use(bodyParser.json())

app.post('/bulkimport', checkAuthenticated, (req, res) => {
  // changed
  var passwords = req.body.passwords
  var dbForUser = new Datastore('./passwords/' + req._passport.session.user + '.db')

  // changed: forEach would just keep running, potentially causing errors
  for (let password of passwords) {
    // changed
    var entry = {
      link: password.url,
      password: password.password,
      name: password.username,
      code: password.name,
    }

    // changed to remove res.send from callback
    let e = false
    dbForUser.insert(entry, (err, doc) => {
      if (err) {
        e = true
      }
    })

    // added to exit from route if an error
    if (e) {
      res.status(500).send()
      return
    }
  }

  res.status(201).send()
})

编辑:

在聊天中,我们还发现nedb并没有真正在磁盘上做任何事情,除非您使用autoload: true或调用loadDatabase调用它,这发生在其中一个数据库上,而不是 Express 路由 ( docs ) 中的那个。 添加它可以使事情正常进行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM