#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.