node.js - mongoose findOne 不是一个函数

标签 node.js mongodb express mongoose

我只是尝试使用 mongodb 版本 3.2.21 创建简单的登录和注册表单,因为我使用的是带有 32 位 CPU 的 Windows 7,所以这里是代码

var express = require('express');
var app = express();
var mongoose = require('mongoose'); 
var consolidate = require('consolidate');
var http = require('http').Server(app);
var io = require('socket.io')(http);
var multer = require('multer')
var upp = multer()
var bodyParser = require('body-parser')
var router = express.Router()


app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(upp.array()); 

app.use(express.static('public'));
app.engine('html', consolidate.mustache);
app.set('view engine', 'html');
app.set('views', __dirname + '/views');
var mongoDB = 'mongodb://localhost/my_database';
mongoose.connect(mongoDB, {useNewUrlParser: true});
// Get Mongoose to use the global promise library
mongoose.Promise = global.Promise;
//Get the default connection
var db = mongoose.connection;
if(db){
console.log('connection')
  }
 //Bind connection to error event (to get notification of connection errors)
 db.on('error', console.error.bind(console, 'MongoDB connection error:'));



var Schema = mongoose.Schema;

var SomeModelSchema = new Schema({
username: String,
password: String
});

var SomeModel = mongoose.model('SomeModel', SomeModelSchema );

var newuser = new SomeModel();



app.get('/', function(req, res){
res.render('mainpage')
})
app.get('/reg', function(req, res){
     res.render('reg')
}) 

app.post('/reeg', function(req,res){
newuser.username = req.body.username;
newuser.password = req.body.password;

newuser.save(function (err, savedObject){
if (err){ 
  console.log(err)
}else{
console.log(savedObject);
res.sendFile(__dirname + '\\views\\mainpage.html')
}})

}); 

app.post('/login', function(req,res){
 var userr = req.body.usernamee
 var pass = req.body.passwordd
 newuser.findOne({username: userr, password: pass}).exec(), 
 function(err,obj){
           if(err) {return res.status(404)
           }else if(!obj){
             res.send('notregistered')
           }if(obj){
             res.send('hey' + userr)
           }



          }})             


         http.listen('8080')

这给了我这个错误 image of error

那么这里有什么问题呢?我尚未使用 Express 路由器,此代码位于一个文件中

最佳答案

newuser 不是模型,它是 SomeModel 的实例 - list of methods here

findOne 是模型的方法 - SomeModel list of methods here

因此将:newuser.findOne替换为SomeModel.findOne

我重写了整体代码,以提高可读性、异步/等待功能,并提供对象解构示例等最佳实践:

'use strict';

const path = require('path');
const http = require('http');
const express = require('express');
const socketIO = require('socket.io');
const bodyParser = require('body-parser');
const consolidate = require('consolidate');


// DB connection
const mongoose = require('mongoose');
const connectionString = 'mongodb://localhost/my_database';
mongoose.Promise = global.Promise;

mongoose
  .connect(connectionString, {useNewUrlParser: true})
  .then(() => {
    console.log('Connection to database established');
  })
  .catch(error => {
    console.error('MongoDB connection error:', error.message);
    process.exit(-1);
  });
// End of: DB connection


// Defining DB schemas and models
const Schema = mongoose.Schema;
const UserSchema = new Schema({
  username: String,
  password: String
});
const User = mongoose.model('User', UserSchema);
// End of: Defining DB schemas and models


// Initial app configuration
const app = express();
const server = http.Server(app);
const io = socketIO(server);

app.engine('html', consolidate.mustache);
app.set('view engine', 'html');
app.set('views', path.join(__dirname, 'views'));

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(express.static('public'));
// End of: Initial app configuration


// App route handlers
app.get(
  '/',
  (req, res) => {
    res.render('mainpage');
  });

app.get(
  '/reg',
  (req, res) => {
    res.render('reg');
  });

app.post(
  '/reg',
  async (req, res) => {
    try {
      const {username, password} = req.body;
      const user = await User.create({username, password});
      console.log('Created user:', user);
      res.sendFile(path.join(__dirname, 'views', 'mainpage.html'));
    }
    catch (error) {
      res.status(500).send(error.message);
    }
  });

app.post(
  '/login',
  async (req, res) => {
    try {
      const {username, password} = req.body;
      const user = await User.findOne({username, password}).select('-password').lean();
      if(!user) {
        res.send('User: ' + username +' not registered');
        return;
      }

      res.send('hey ' + username);
    }
    catch (error) {
      res.status(500).send(error.message);
    }
  });
// End of: App route handlers


// Binding http listener to port
server.listen('8080');

注意:lean是查询方法manual here

修复您的登录表单:

<form action="/login" method="POST"> 
  <input type="text" placeholder="username" name="username"> 
  <input type="password" placeholder="pass" name="password"> 
  <button type="submit">Login</button> <br/>
  or <strong><a href="/reg">Sign Up</a></strong>
</form>

附注如果出现问题,请在评论中写下。

关于node.js - mongoose findOne 不是一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53681711/

相关文章:

php - MongoDB + PHP : support for SSL?

node.js - Mongoose中的多次更新操作

node.js - 如何在页面刷新时执行NodeJS函数

javascript - node.js 流头范围未定义

javascript - 如何解析 Node.js 和 mongodb 查询中的对象数组?

Mongodb - 更改数据库名称

javascript - NodeJS - 每个异步/等待的映射

node.js - 使用 process.on('uncaughtException 显示 500 错误页面

javascript - 如何从回调函数获取外部范围的值?

Javascript 检查对象是否具有特定属性值