如何从 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);
现在,当您查找用户或用户时,将不会在响应中返回密码。我也改进了你的架构。
我正在使用 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);
现在,当您查找用户或用户时,将不会在响应中返回密码。我也改进了你的架构。