'How to remove a specific key from JSON response coming from MongoDB in ExpressJS
I'm creating a simple application using MEAN stack. My code is working fine but i want to remove one key from the response. Please look at my 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');
Notice that I've commented out password key. But I guess that's not enough. As I can still see password in response:
Postman screenshot
(Note: Email Id and encrypted Password in this image are absolutely fake and hence there's no security issue)
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);
}
});
});
Now tomorrow When I'll be using real email and password, though I'll encrypt the password but still i don't want to show password key whatsoever. It should not be displayed in the network tab of browser also.
Please give me some directions.
Solution 1:[1]
You can try this :
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 });
});
Solution 2:[2]
If you just do not want to show the password while outputting the data then you just need to do this in your schema:
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);
Now when you will find users or a user, a password or passwords will not be returned in the response. I improved your schema too.
Solution 3:[3]
Your $search_params is not available within the callback function. You must explicitly pass it with use
$search_params = array_filter(
$search_params,
function ($val, $key) use ($search_params) {
return (isset($search_params[$key]) && $val != 'undefined');
},
ARRAY_FILTER_USE_BOTH
);
As of PHP 7.4 you may use arrow functions, which have access to the above scope:
$search_params = array_filter(
$search_params,
fn ($val, $key) => isset($search_params[$key]) && $val != 'undefined',
ARRAY_FILTER_USE_BOTH
);
Read more here:
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Boringcoder |
| Solution 2 | Daniyal Malik |
| Solution 3 | Hast |

