отправка объекта в экспресс приводит к появлению пустого объекта

#node.js #express

Вопрос:

Вот метод после входа в систему маршрутизатора пользователя, он находит пользователя, генерирует токен и возвращает объект, содержащий указанного пользователя и токен. Это также утешает.войдите в систему пользователя, чтобы я был уверен, что он загружен.

 router.post("/user/login", async (request, response) => {
try{

    const user = await User.findByCredentials(request.body.email, request.body.password)
    const token = await user.generateAuthToken()
    console.log(user)
    response.json({
        user: user,
        token
    })
}catch(error){
    console.log(error)
    response.status(400).send()
}
})
 

Это модель пользователя, которую я научился создавать на курсе Udemy Эндрю Мида.

 const validator = require("validator")
const bcrypt = require("bcrypt")
const jwt = require("jsonwebtoken")

const Housekeeping = require("./housekeeping")

const userSchema = mongoose.Schema({
name:{
    type: String,
    required: true,
    trim: true
},
surname:{
    type: String,
    required: true,
    trim: true
},
role:{
    type: String,
    required: true
},
password: {
    type: String,
    required: true,
    validate(value){
        if(value < 6){
            throw new Error("Password must be at least 6 characters long.")
        }

        if(value.toLowerCase().includes("password")){
            throw new Error("Password can't contain "password".")
        }
    }
},
email: {
    type: String,
    unique: true,
    lowercase: true,
    validate(value){
        if(!validator.isEmail(value)){
            throw new Error("Email is invalid.")
        }
    }
},
tokens: [{
    token:{
        type: String,
        required: true
    }
}]
},{
timestamps: true
})
//Reference fields
userSchema.virtual("housekeepings", {
ref: "Housekeeping",
localField: "_id",
foreignField: "user"
})

//Custom schema methods
userSchema.methods.generateAuthToken = async function(){
const user = this

const token = jwt.sign({_id: user._id.toString()}, process.env.JWT_SECRET)
user.tokens = user.tokens.concat({token})
await user.save()

return token
}

userSchema.methods.toJSON = async function(){
const user = this
const userObject = user.toObject()

delete userObject.password
delete userObject.tokens

return userObject
}

userSchema.statics.findByCredentials = async (email, password) => {
const user = await User.findOne({email})

if(!user){
    throw new Error("Unable to login.")
}

const isMatch = await bcrypt.compare(password, user.password)

if(!isMatch){
    throw new Error("Unable to login")
}

return user
}

//Middleware
userSchema.pre("save", async function(next){
const user = this

if(user.isModified("password")){
    user.password = await bcrypt.hash(user.password, 10)
}

next()
})

const User = mongoose.model("User", userSchema)

module.exports = User
 

Консоль.журнал показывает объект пользователя, как и ожидалось, но результатом с другой стороны является пустой объект («пользователь»:{})

Я использую почтальона для проверки

Ответ почтальона

Я использую следующее программное обеспечение:

  • ОС: RHEL8 (Red Hat Enterprise Linux 8)
  • IDE: Код Visual Studio V1.58
  • Node.js: V10.24.0
  • Экспресс: V6.14.11

Комментарии:

1. Вы пробовали использовать response.json({user, token}) вместо response.send(...) этого ? res.send(...) Функция устанавливает тип содержимого в text/Html, что означает, что клиент теперь будет рассматривать его как текст. Затем он возвращает ответ клиенту. res.json(...) Функция с другой стороны передает заголовок типа содержимого приложению/JSON, чтобы клиент обрабатывал строку ответа как допустимый объект JSON. Затем он также возвращает ответ клиенту.

2. Привет, Карло, я попробовал твое предложение, но безуспешно, но спасибо, что попытался 🙂

3. Можете ли вы добавить дополнительную информацию, чтобы лучше понять проблему

4. Вы получили жетон, также пустой с другой стороны ?

5. Существует ли какое-либо другое промежуточное программное обеспечение, которое может изменить все, что вытекает из вашего метода? Другими словами, сохраняется ли проблема в урезанном приложении, которое состоит только из этого конкретного маршрута?

Ответ №1:

Я считаю async , что ключевое слово вызывает проблему в следующей строке пользовательской схемы:

 userSchema.methods.toJSON = async function(){
 

Таким образом, удаление асинхронности может решить проблему.

Причиной может быть та же проблема с этой проблемой в github.