如何从 ExpressJS 中来自 MongoDB 的 JSON 响应中删除特定键

How to remove a specific key from JSON response coming from MongoDB in ExpressJS

我正在使用 MEAN 堆栈创建一个简单的应用程序。我的代码工作正常,但我想从响应中删除一个键。请看我的ocde

models/user.js

const mongoose = require('mongoose');

const Schema = mongoose.Schema;
const userSchema = new Schema({
    firstName: String,
    lastName: String,
    email: String,
    //password: String, // <--------- commented out
    userid: String,
    skills: []
})

module.exports = mongoose.model('user', userSchema, 'users');

请注意,我已经注释掉了 password 键。但我想这还不够。因为我仍然可以在响应中看到密码:

邮递员截图

(注意:此图片中的电子邮件 ID 和加密密码绝对是假的,因此不存在安全问题)

api.js

const User = require('../models/user');
...
router.get('/users', function (req, res) {
    console.log('Get request for all users');
    User.find({})
        .exec(function (err, user) {
            if (err) {
                console.log("Error retrieving users");
            } else {
                res.json(user);
            }
        });
});

现在明天当我将使用真实的电子邮件和密码时,虽然我会加密密码但我仍然​​不想显示 password 密钥。它也不应该显示在浏览器的网络选项卡中。

请给我一些指示。

您可以使用 mongoose select 方法来排除某些字段。 https://mongoosejs.com/docs/api.html#query_Query-select

User.find({})
        .select('-password')
        .exec(function (err, user) {
            if (err) {
                console.log("Error retrieving users");
            } else {
                res.json(user);
            }
        });

你可以试试这个:

const User = require('../models/user');
...
router.get('/users', function (req, res) {
    console.log('Get request for all users');
    const user = User.find({} , {password:0});

    return res.json({ user: user });
});

如果您只是不想在输出数据时显示密码,那么您只需要在您的架构中执行此操作:

const MongooseSchema = new mongoose.Schema({
  firstName: {
    type: String,
    required: [true, 'Please enter a first name!'],
  },
  lastName: {
    type: String,
    required: [true, 'Please enter a last name!'],
  },
  email: {
    type: String,
    unique: true,
    required: [true, 'Please enter an email address!'],
    match: [
      /^(([^<>()[\]\.,;:\s@"]+(\.[^<>()[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
      'Please enter a valid email address',
    ],
  },
  password: {
    type: String,
    required: [true, 'Please enter a password'],
    select: false,
  },
  // userid: String, Id for user will be created by mongodb automatically
  skills: {
    type: Array,
    required: [true, 'Please enter skills!'],
  },
  createdAt: {
    type: Date,
    default: Date.now,
  },
});

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

现在,当您查找用户或用户时,将不会在响应中返回密码。我也改进了你的架构。