Express 如果条件为',则拒绝PUT请求;t遇见

Express 如果条件为',则拒绝PUT请求;t遇见,express,mongoose,Express,Mongoose,如果登录用户尝试更新其电子邮件地址,我在拒绝PUT请求时遇到问题。我想确保只有授权用户才能更新自己的电子邮件。它似乎不喜欢我的res.end()或return;如何在更新之前编写代码以满足此条件 app.js app.patch('/:id', (req, res) => { if(req.body.oldEmail){ let user = req.body.id; if (user.email !== req.body.oldEmail) { res.send

如果登录用户尝试更新其电子邮件地址,我在拒绝PUT请求时遇到问题。我想确保只有授权用户才能更新自己的电子邮件。它似乎不喜欢我的res.end()或return;如何在更新之前编写代码以满足此条件

app.js


app.patch('/:id', (req, res) => {

if(req.body.oldEmail){

  let user = req.body.id;
  if (user.email !== req.body.oldEmail) {
      res.sendStatus(401);
  } else {
      User.update(
          {email: req.body.oldEmail},
          {email: req.body.newEmail}

      ).then(user => {
          console.log(user);
          res.json(user);
      }).catch(err => console.log(err));
  }
}

auth.service.ts

从“@angular/core”导入{Injectable};
从“@angular/common/http”导入{HttpClient};
从“@angular/Router”导入{Router}”;
从“rxjs”导入{Subject};
从“/auth data.model”导入{AuthData}”;
从“/auth data login.model”导入{AuthDataLogin}”;
从“/login/login.service”导入{LoginService};
@可注射({providedIn:“根”})
导出类身份验证服务{
private isAuthenticated=false;
私有令牌:字符串;
私人代币计时器:任何;
私有用户名:字符串;
private authStatusListener=新主题();
私有userId:string;
建造师(
私有http:HttpClient,
专用路由器:路由器,
私人登录服务:登录服务
) {}
getToken(){
返回此.token;
}
getIsAuth(){
返回此。已验证;
}
getUserId(){
返回this.userId;
}
getAuthStatusListener(){
返回此.authStatusListener.asObservable();
}
createUser(
电子邮件:string,
密码:string,
instagramName:string,
21岁以上:布尔型,
角色:字符串
) {
常量authData:authData={
电邮:电邮,,
密码:密码,
instagramName:instagramName,
21岁以上:21岁以上,
角色:角色,,
全名:“尚未添加”,
地址1:“无”,
地址2:“无”,
城市:“无”,
声明:“无”,
zip:“无”
};
这是http
.post(“http://localhost:3000/api/user/signup“,authData)
.订阅(响应=>{
控制台日志(响应);
});
}
登录(电子邮件:字符串,密码:字符串){
const authData:AuthDataLogin={email:email,password:password};
这是http
.post(“http://localhost:3000/api/user/login“,authData)
.订阅(响应=>{
const token=response.token;
控制台日志(“响应”);
控制台日志(响应);
//this.userName=响应;
//console.log(this.userName);
this.userName=response.instagramName;
console.log(this.userName);
this.token=token;
如果(令牌){
const expiresInDuration=response.expiresIn;
this.setAuthTimer(expireInstruction);
this.isAuthenticated=true;
this.userId=response.userId;
this.userName=response.instagramName;
this.authStatusListener.next(true);
const now=新日期();
const expirationDate=新日期(
现在.getTime()+expireInstruction*1000
);
控制台日志(过期日期);
this.saveAuthData(令牌、过期日期、this.userId);
这个.router.navigate([“/”]);
let key=“UserID”;
}
});
}
autoAuthUser(){
const authInformation=this.getAuthData();
如果(!authInformation){
返回;
}
const now=新日期();
const expiresIn=authInformation.expirationDate.getTime()-now.getTime();
如果(expiresIn>0){
this.token=authInformation.token;
this.isAuthenticated=true;
this.userId=authInformation.userId;
此.setAuthTimer(expiresIn/1000);
this.authStatusListener.next(true);
}
}
注销(){
this.token=null;
this.isAuthenticated=false;
this.authStatusListener.next(false);
clearTimeout(this.tokenTimer);
这是.clearAuthData();
this.userId=null;
//location.reload();
this.router.navigate([“/login”]);
}
私有setAuthTimer(持续时间:个){
//console.log(“设置计时器:+持续时间”);
this.tokenTimer=setTimeout(()=>{
此参数为.logout();
},持续时间*1000);
}
私有saveAuthData(令牌:字符串,过期日期:日期,用户标识:字符串){
setItem(“token”,token);
setItem(“expiration”,expirationDate.toISOString());
setItem(“userId:”,userId);
localStorage.setItem(“username”,this.username);
}
私有clearAuthData(){
localStorage.removietem(“令牌”);
localStorage.removietem(“到期”);
localStorage.removietem(“userId”);
localStorage.removietem(“用户名”);
}
私有getAuthData(){
const token=localStorage.getItem(“token”);
const expirationDate=localStorage.getItem(“到期”);
const userId=localStorage.getItem(“userId:”);
如果(!令牌| |!过期日期){
返回;
}
返回{
令牌:令牌,
到期日期:新日期(到期日期),
userId:userId
};
}
}

您的代码有几个问题:

  • 在检查用户的电子邮件是否相同之前,您似乎正在更新电子邮件地址
  • 您应该使用res.sendStatus(401)而不是res.end()
  • 尝试将您的代码更改为类似以下内容,看看这是否符合您的要求:

    app.put('/email/:id', (req, res) => {
        let user = // get the user first to check the email.
        if (user.email !== req.body.oldEmail) {
            res.sendStatus(401);
        } else {
            User.update(
                {email: req.body.oldEmail},
                {email: req.body.newEmail}
    
            ).then(user => {
                console.log(user);
                res.json(user);
            }).catch(err => console.log(err));
        }
    });
    

    您的代码有几个问题:

  • 在检查用户的电子邮件是否相同之前,您似乎正在更新电子邮件地址
  • 您应该使用res.sendStatus(401)而不是res.end()
  • 尝试将您的代码更改为类似以下内容,看看这是否符合您的要求:

    app.put('/email/:id', (req, res) => {
        let user = // get the user first to check the email.
        if (user.email !== req.body.oldEmail) {
            res.sendStatus(401);
        } else {
            User.update(
                {email: req.body.oldEmail},
                {email: req.body.newEmail}
    
            ).then(user => {
                console.log(user);
                res.json(user);
            }).catch(err => console.log(err));
        }
    });
    

    如何在应用程序中实现身份验证?使用护照?发布关于身份验证的代码我相信我上面添加的文件就是你想要的,你如何在你的应用程序中实现身份验证?使用护照?发布关于身份验证的代码我相信我在上面添加的文件是您想要的,但我不明白的是,您试图在值存在之前分配let user=。我不确定在从后端抓取值之前您将如何计算正确,您需要从dat获取用户