我们将Angular与Node.js Express一起使用。我们尝试从设置页面更新用户详细信息,但是当单击更新按钮时会抛出:
无法加载资源:net :: ERR_CONNECTION_RESET 似乎无法通过可观察对象发送更新。当我在Node中检查此URL时: http://localhost:3000/api/chatapp/user/edit-user 在浏览器中显示 {“ message”:“ No Authorization”} 。这是代码。
角度
EditUser(body): Observable<any> {
return this.http.post(`${BASEURL}/user/edit-user`, body);
}
TS
private populateForm() {
const unusedFields = [
'_id',
...
...
];
const userInfo = Object.assign({}, this.user);
unusedFields.forEach((field) => delete userInfo[field]);
this.SettingsForm.setValue(userInfo);
}
private buildSettingsForm() {
this.SettingsForm = this.fb.group({
email: [null, [Validators.required, Validators.email], this.forbiddenEmails],
firstName: [null, [Validators.required, Validators.pattern('[a-zA-Z ]*')]],
jobTitle: [null, [Validators.required]],
lastName: [null, [Validators.required, Validators.pattern('[a-zA-Z ]*')]],
username: [null, [Validators.required, Validators.pattern('(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])')]]
});
this.SettingsForm.setValidators(this.minimumAge(18));
}
UpdateUser() {
this.usersService.EditUser(this.SettingsForm.value).subscribe(
data => {
console.log(data);
this.router.navigate(['main']);
},
err => console.log(err)
);
}
也 Node.js :
async EditUser(req, res,next) {
User.findById(req.user.id, function (err, user) {
if (!User) {
return res
.status(httpStatus.INTERNAL_SERVER_ERROR)
.json({ message: 'User is not found' });
}
const schema = Joi.object().keys({
username: Joi.string()
.min(4)
.max(10)
.required(),
email: Joi.string()
.email()
.required(),
firstName: Joi.string().required(),
lastName: Joi.string().required(),
jobTitle: Joi.string().required(),
});
const { error, value } = Joi.validate(req.body, schema);
if (error && error.details) {
return res.status(HttpStatus.BAD_REQUEST).json({ msg: error.details })
}
const email = Helpers.lowerCase(req.body.email);
const username = Helpers.lowerCase(req.body.username);
const firstName = req.body.firstName;
const lastName = req.body.lastName;
const jobTitle = req.body.jobTitle;
User.email = email;
User.firstName = firstName;
User.lastName = lastName;
User.username = username;
User.jobTitle = jobTitle;
User.update()
});
}
}
路由器
router.post('/user/edit-user', AuthHelper.VerifyToken, UserCtrl.EditUser);
MongoDb
const userSchema = mongoose.Schema({
username: { type: String },
email: { type: String },
isVerified: { type: Boolean, default: false },
password: { type: String },
passwordResetToken: String,
passwordResetExpires: Date,
firstName: { type: String },
lastName: { type: String },
jobTitle: { type: String },
...
...
module.exports = mongoose.model('User', userSchema);
我认为Node.js控制器和Angular函数都出了问题。怎么了?我们如何解决该错误?
答案 0 :(得分:0)
您是否随请求一起发送了令牌?!
您忘记构造模式
const userSchema = new mongoose.Schema({
username: { type: String },
email: { type: String },
...
)}
要捕获该错误,您可以将回调作为保存函数的参数传递。
user.save(function (err, updatedUser) {
if (err) {
/* Handle the error */
};
});
您可以使用集合user.set({ [key]: value });
来代替点号直接访问,例如user.firstname
在您的情况下,就像
user.set({
email: email,
firstName: firstName,
lastName: lastName,
username: username,
jobTitle: jobTitle
})
您的最终代码将是
async EditUser(req, res, next) {
User.findById(req.user.id, function (err, user) {
if (!user) {
return res
.status(httpStatus.INTERNAL_SERVER_ERROR)
.json({ message: 'User is not found' });
}
const schema = Joi.object().keys({
username: Joi.string()
.min(4)
.max(10)
.required(),
email: Joi.string()
.email()
.required(),
firstName: Joi.string().required(),
lastName: Joi.string().required(),
jobTitle: Joi.string().required(),
});
const { error, value } = Joi.validate(req.body, schema);
if (error && error.details) {
return res.status(HttpStatus.BAD_REQUEST).json({ msg: error.details })
}
const email = Helpers.lowerCase(req.body.email);
const username = Helpers.lowerCase(req.body.username);
const firstName = req.body.firstName;
const lastName = req.body.lastName;
const jobTitle = req.body.jobTitle;
user.set({
email: email,
firstName: firstName,
lastName: lastName,
username: username,
jobTitle: jobTitle
});
user.save(function (error, updatedUser) {
if (error) {
/* Handle it */
}
})
});
}
您可以在猫鼬文档中了解更多信息
请注意,在populateForm
方法中,您可以在unusedFields
数组上过滤对象,而无需使用 delete
关键字