Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在MEVN堆栈应用程序中从MongoDB返回当前用户信息_Javascript_Node.js_Mongodb_Express_Vue.js - Fatal编程技术网

Javascript 如何在MEVN堆栈应用程序中从MongoDB返回当前用户信息

Javascript 如何在MEVN堆栈应用程序中从MongoDB返回当前用户信息,javascript,node.js,mongodb,express,vue.js,Javascript,Node.js,Mongodb,Express,Vue.js,我正在尝试使用Vue、Express、Node和MongoDB构建一个基本的登录/注册应用程序。我已经成功地设置了Express router,允许用户注册和登录,基本用户信息存储在MongoDB中。我试图在登录后将用户数据返回到屏幕。到目前为止,我已经在Express中设置了router.get(),将所有用户的用户名返回到屏幕上。但是,我想将Vue.js中的axios.get()方法配置为只返回登录用户的用户名,而不是存储在MongoDB中的所有用户名。通常在Firebase中,我会使用类似

我正在尝试使用Vue、Express、Node和MongoDB构建一个基本的登录/注册应用程序。我已经成功地设置了Express router,允许用户注册和登录,基本用户信息存储在MongoDB中。我试图在登录后将用户数据返回到屏幕。到目前为止,我已经在Express中设置了
router.get()
,将所有用户的用户名返回到屏幕上。但是,我想将Vue.js中的
axios.get()
方法配置为只返回登录用户的用户名,而不是存储在MongoDB中的所有用户名。通常在Firebase中,我会使用类似于
let snapshot=await ref.where('userid','=',Firebase.auth().currentUser.uid).get()
的东西专门发回有关当前用户的信息。如何设置我的
axios.get()
方法来执行类似的操作?我的代码如下:

登录页面

<template>
  <b-row>
    <b-col cols="12">
      <h2>
        You are now logged in!
        <b-link @click="logout()">(Logout)</b-link>
      </h2>
      <table style="width:100%">
        <tr>
          <th>User Names</th>
        </tr>
        <tr v-for="user in users" :key="user._id">
          <td>{{ user.username }}</td>
        </tr>
      </table>
      <ul v-if="errors && errors.length">
        <li v-for="error of errors" :key="error._id">
          <b-alert show>{{error.message}}</b-alert>
        </li>
      </ul>
    </b-col>
  </b-row>
</template>

<script>

import axios from 'axios'

export default {
  name: 'BookList',
  data () {
    return {
      users: [],
      errors: []
    }
  },
  created () {
    axios.defaults.headers.common['Authorization'] = localStorage.getItem('jwtToken')
    axios.get(`http://localhost:3000/api/auth`)
      .then(response => {
        this.users = response.data
      })
    },
    methods: {
      logout () {
        localStorage.removeItem('jwtToken')
        this.$router.push({
          name: 'Login'
        })
      }
    }
  }
  </script>

User.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var bcrypt = require('bcryptjs');

var UserSchema = new Schema({
  username: {
        type: String,
        unique: true,
        required: true
    },
  password: {
        type: String,
        required: true
    }
});

UserSchema.pre('save', function (next) {
    var user = this;
    if (this.isModified('password') || this.isNew) {
        bcrypt.genSalt(10, function (err, salt) {
            if (err) {
                return next(err);
            }
            bcrypt.hash(user.password, salt, null, function (err, hash) {
                if (err) {
                    return next(err);
                }
                user.password = hash;
                next();
            });
        });
    } else {
        return next();
    }
});

UserSchema.methods.comparePassword = function (passw, cb) {
    bcrypt.compare(passw, this.password, function (err, isMatch) {
        if (err) {
            return cb(err);
        }
        cb(null, isMatch);
    });
};

module.exports = mongoose.model('User', UserSchema);

注册路由

router.post('/register', function(req, res) {
  if (!req.body.username || !req.body.password) {
    res.json({success: false, msg: 'Please pass username and password.'});
  } else {
    var newUser = new User({
      username: req.body.username,
      password: req.body.password
    });
    // save the user
    newUser.save(function(err) {
      if (err) {
        return res.json({success: false, msg: 'Username already exists.'});
      }
      res.json({success: true, msg: 'Successful created new user.'});
    });
  }
});

我假设您的用户模型有用户名和密码字段,并且您的密码在db中加密

对于查找用户名为的用户,如果用户在请求正文中将user.password与加密密码进行比较。 如果找不到用户,或者密码不匹配,我将发送
400错误请求

const bcrypt=require(“bcryptjs”);
路由器.post(“/”,异步(请求,恢复)=>{
const{username,password}=req.body;
如果(!(用户名和密码))
返回res.status(400).json({error:“需要用户名和密码”});
试一试{
let user=wait user.findOne({username});
如果(!user)返回res.status(400).json({error:“invalid login”});
const validPassword=wait bcrypt.compare(密码,user.password);
如果(!validPassword)返回res.status(400).json({错误:“无效登录”});
user.password=未定义;
res.json(用户);
}捕捉(错误){
控制台日志(err);
返回下一个(错误);
}
});
要在保存用户之前对密码进行哈希运算,可以将此代码添加到用户模型中吗

UserSchema.pre('save',异步函数(下一步){
this.password=wait bcrypt.hash(this.password,12);
next();
});
注册路线:

router.post(“/register”),异步(req,res)=>{
const{username,password}=req.body;
如果(!用户名| |!密码)
返回res.json({success:false,msg:“请传递用户名和密码。”});
试一试{
let user=wait user.findOne({username});
if(user)返回res.json({success:false,msg:“用户名已经存在。”});
user=新用户({username,password});
等待user.save();
res.json({success:true,msg:“Successful created new user.”);
}捕捉(错误){
控制台日志(err);
res.json({success:false,msg:“有东西坏了”});
}
});

@SuleymanSah,你为什么要删除你的答案?你的问题出在get-route中了吗?我想问题出在route和Vue.js模板中的axios.get()方法中。我以特定用户身份登录,希望配置route和get方法以仅将我的用户名返回到屏幕。我没有vue方面的经验,但我可以在express side中提供帮助,我取消删除了答案,检查它是否有助于确定路线是否与我答案中的代码一起工作?再次感谢。这似乎是一个合乎逻辑的答案,但它仍然没有返回特定的用户。我在创建的生命周期钩子中使用了console.log,但是没有数据返回给this.users。我认为Vue.js函数很好。是否可以使用get路由的其他配置?@JS_Is_awesome 18如果用户模型具有用户名和密码字段,并且密码未在数据库中加密,则此路由必须返回用户。你能和邮递员试一下路线吗?打得好。我只是试着在邮递员那里运行“获取”路线。它返回第二个错误,“用户名和密码是必需的”@实际上这一定是一个post请求,我编辑了答案我应该注意,密码是用
bcrypt nodejs
加密的。
router.post('/register', function(req, res) {
  if (!req.body.username || !req.body.password) {
    res.json({success: false, msg: 'Please pass username and password.'});
  } else {
    var newUser = new User({
      username: req.body.username,
      password: req.body.password
    });
    // save the user
    newUser.save(function(err) {
      if (err) {
        return res.json({success: false, msg: 'Username already exists.'});
      }
      res.json({success: true, msg: 'Successful created new user.'});
    });
  }
});