.insertOne 不是函数

Posted

技术标签:

【中文标题】.insertOne 不是函数【英文标题】:.insertOne is not a function 【发布时间】:2018-03-23 08:52:48 【问题描述】:

我想先说我已经阅读了几篇关于这个问题的帖子。

我有一个 node/express/mongo 应用程序,其中包含以下内容:

app.js:

    var express = require('express')
    var bodyParser = require('body-parser')
    var cors = require('cors')
    var morgan = require('morgan')
    var mongoose = require('mongoose')
    var passport = require('passport')

    var app = express()

    // MongoDB Setup
    var configDB = require('./config/database.js')
    mongoose.connect(configDB.url)

    app.use(morgan('combined'))
    app.use(bodyParser.json())
    // Check security with this
    app.use(cors())
     // load our routes and pass in our app and fully configured passport

    require('./routes')(app)
    app.listen(process.env.PORT || 8081)
    console.log('We are up and running, captain.')

routes.js

const AuthenticationController = require('./controllers/AuthenticationController')

module.exports = (app) => 
  app.post('/register', AuthenticationController.register)

我的 mongo 架构文件 Account.js:

const mongoose = require('mongoose')
const bcrypt = require('bcrypt-nodejs')
const Schema = mongoose.Schema

var accountSchema = new Schema(
  email: String,
  password: String,
  likesPerDay:  type: Number, min: 0, max: 250 ,
  followPerDay:  type: Number, min: 0, max: 250 ,
  unfollowPerDay:  type: Number, min: 0, max: 250 ,
  commentsPerDay:  type: Number, min: 0, max: 250 ,
  comment: String,
  hashtags: [String]
)

// methods ======================
// generating a hash. We hash password within user model, before it saves to DB.
accountSchema.methods.generateHash = function (password) 
  return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null)


// checking if password is valid
accountSchema.methods.validPassword = function (password) 
  return bcrypt.compareSync(password, this.local.password)


// create the model for users and expose it to our app
module.exports = mongoose.model('Account', accountSchema)

最后是我的控制器文件 AuthenticationController.js

const Account = require('../models/Account.js')
// var bodyParser = require('body-parser')

module.exports = 
  register (req, res) 
    Account.findOne(email: req.body.id, function (err, account) 
      if (err) 
        console.log('Could not regster user')
        throw err
      
      if (account) 
        console.log('account already exists')
       else 
        Account.insertOne(email: req.body.email, password: req.body.password, function (err, res) 
          if (err) 
            console.log('could not insert')
            throw err
          
          console.log('inserted account')
          Account.close()
        )
      
    )
  

当我调用 Account.insertOne 函数时,我的 AuthenticationController 文件中出现错误。

我得到的错误是

TypeError: Account

现在堆栈上的一些帖子建议我确保我正在从我正在做的模型类中导出模型,这将解决这个问题。这很奇怪,因为findOne 方法似乎很好,但是当我调用insertOne 时,我遇到了问题。

我错过了什么吗?

【问题讨论】:

【参考方案1】:

编辑

截至mongoose documentation,尝试使用

Account.create( ...params ... , function (err, small) 
  if (err) return handleError(err);
  // saved!
)

【讨论】:

【参考方案2】:

Mongoose 模型没有insertOne 方法。请改用create 方法:

Account.create(email: req.body.email, password: req.body.password, function (err, doc) 

【讨论】:

我之前使用updateOneupsert,我注意到create 将创建一个名为__v 的密钥。如何禁用此功能? @AaronFranke 这有帮助吗? ***.com/questions/13699784/mongoose-v-property-hide迟到总比不到好【参考方案3】:

The Mongoose docs 展示如何创建文档:

通过Account.create()

Account.create(email: req.body.email, password: req.body.password, function (err, res) 
    // ...
)

或者通过实例化和save()ing帐户:

new Account(email: req.body.email, password: req.body.password).save(function (err, res) 
    // ...
)

【讨论】:

【参考方案4】:

insertOne 命令在 mongoose 中不可用,如Mongoose Documentation 中所述。如果您想使用insertOne 命令,那么您需要使用批量命令才能将此命令发送到 MongoDB 服务器。像下面的东西。我希望这行得通。

Account.bulkWrite([
  
    insertOne: 
      document: email: req.body.email, password: req.body.password
    
  
]

【讨论】:

以上是关于.insertOne 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

错误:TypeError:user.insertOne 不是使用猫鼬的函数

如何在php中修复“未捕获的错误:在null上调用成员函数insertOne()”

使用 InsertOne/UpdateOne 在 DB 中添加值 - 如果找到以前的值;返回 NaN 而不是实际数字

insert(),insertOne()和insertMany()方法有什么区别?

mongodb3.2系统性学习——1文档插入insert insertOne insertMany

MongooseError:操作 `products.insertOne()` 缓冲在 10000 毫秒后超时