【问题标题】:How to use findOne() in mongoose如何在猫鼬中使用 findOne()
【发布时间】:2019-11-12 09:28:16
【问题描述】:

我有 node.js 代码,我使用猫鼬。我没有收到任何错误,只是Successfuly logged in

我这几天正在尝试解决这个问题,我尝试了很多东西,但都没有奏效。

这是服务器代码:

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const model = require('.//models/schema');

app.use(express.static('public'));

app.get('/register', function(request, response) {
  response.sendFile(__dirname + '/html/register.html');
});

app.get('/login', function(request, response){
  response.sendFile(__dirname + '/html/login.html')
});

const listener = app.listen(3000, function() {
  let myURL = new URL(`localhost:${listener.address().port}/register`);
  console.log(myURL.href);
});

mongoose.connect(`mongodb://localhost${listener.address().port}:/register`, {
    useNewUrlParser: true,
    useUnifiedTopology: true    
    });

app.use(bodyParser.urlencoded({
    extended: false
 }));

app.use(bodyParser.json());

app.post('/submit-data', async (req, res) => {
  res.redirect('/login')
  try {
    const newUser = new model({
      'login': req.body.login,
      'password': req.body.password,
      'gender': req.body.gender,
      'birthday': req.body.birthday
    });

    await newUser.save();
    console.log('User registered');
  } catch {
    console.log('Registeration failed')
  }
});

app.post('/submit-login', (req, res) => {
  const user = model.findOne({
    'login': req.body.login,
    'password': req.body.password,
  });
  if (!user) {
    console.log('Login failed');
  } else {
    console.log('Successfully logged in')
  }
});

这是型号代码:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

let schema = new Schema({
    'login': String,
    'password': String,
    'gender': String,
    'birthday': String
  });

module.exports = mongoose.model('allInfo', schema);

如果密码或登录名不同,我希望它打印“登录失败”,如果密码和登录名相同,则打印“成功登录”。

【问题讨论】:

  • 因为你的 if 语句总是真实的if (!user)。用户为真,因为具有键值对的对象是真实的 e.i. : 它将解析为真。即使是空的对象也是真实的:let user = {}; console.log(!!user);
  • @Michelangelo 没有匹配项时,mongoose.findOne 将返回null,因此 if 条件并不总是真实的。

标签: javascript node.js mongoose


【解决方案1】:

您需要查看docs

您应该将条件移动到回调中,如下所示:

const user = model.findOne({
  'login': req.body.login,
  'password': req.body.password,
}, function (err, user) {
  if (!user) {
    console.log('Login failed');
  } else {
    console.log('Successfully logged in')
  }
}));

更新

还有一件事要注意,来自mongoose.model Docs

第一个参数是您的模型所针对的集合的单数名称。 Mongoose 会自动查找您的型号名称的复数、小写版本。

这意味着在您的代码中,模型将寻找一个名为 allinfos 的集合,如果您在数据库中的表名为 users,那么您应该更改此行

module.exports = mongoose.model('allInfo', schema);

到这里:

module.exports = mongoose.model('User', schema); // This will look-up the collection users

【讨论】:

  • @CheapsiT 你能记录下用户的结果吗?
  • @CheapsiT 我已经添加了一些注意事项,也许这是您遇到的困惑,如果仍然无法解决,请提供错误消息或更多信息以帮助您调试例如:console.log(user) like @Michelangelo 建议
猜你喜欢
  • 2011-10-25
  • 2012-09-30
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 2020-12-31
  • 2023-03-26
  • 2021-06-18
相关资源
最近更新 更多