尝试在 node.js 中发出 PUT 请求

Posted

技术标签:

【中文标题】尝试在 node.js 中发出 PUT 请求【英文标题】:Trying to make a PUT request in node.js 【发布时间】:2021-01-06 11:39:35 【问题描述】:

我正在尝试使用 javascript 向 node.js 发出 PUT 请求。基本上,我想做的是让经过身份验证的用户可以更新电话号码和密码。通常我会使用req.body 来让主体用于发出更新请求,但是整个主体都有usernamepasswordphoneNumber。我只需要更新密码和电话号码。除了登录的注册用户之外,我有一个限制此请求的限制函数,并且我还有一个用于更新的模型函数:

function updateUser(changes, id) 
    return db("users")
    .update(changes)
    .where(id)

我还试图确保用户决定更新的密码(或他们当前拥有的密码)经过哈希处理。我正在使用 bcryptjs 对密码进行哈希处理。我有两个 post 请求,它们都加密密码(这是我的注册功能)和一个比较加密(我的登录功能)的请求。我会将这两个都包括在内,以防您需要任何背景信息:

router.post("/register", async (req, res, next) => 
    try 
        const username, password, phoneNumber = req.body
        const user = await Users.findBy(username).first()

        if(user) 
            return res.status(409).json(
                message: "Username is already in use",
            )
        
        const newUser = await Users.create(
            username,
            password: await bcrypt.hash(password, 14),
            phoneNumber,
        )

        res.status(201).json(newUser)
     catch (err) 
        next(err)
    
)


router.post("/login", async(req, res, next) => 
    try 
        const username, password = req.body
        const user = await Users.findBy(username).first()
        
        if(!user) 
            return res.status(401).json(message: "Invalid Username or Password",)
        

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

        if(!passwordValid) 
            return res.status(401).json(message: "Invalid Username or Password",)
        
        
        const token = jwt.sign(
            userId: user.id,
        , process.env.JWT_SECRET)
        

        res.cookie("token", token)

        res.json(
            message: `Welcome to your plant page $user.username!`
        )
     catch (err) 
        next(err)
    
);

当我试图开始我的 PUT 请求时,我已经开始写 const phoneNumber, password = req.body 但我需要在函数中同时使用电话号码和密码。这是我开始编写代码的示例:

router.put("/:id/updateaccount", restrict(), async(req, res, next) => 
    try 
        const phoneNumber, password = req.body
     catch(err) 
        next(err)
    
) 

【问题讨论】:

您能否更好地描述您无法做到的事情,以及您认为它失败的原因?尽管描述通常很好,但很难理解问题是什么。我还建议您将逻辑保留在您的路由文件之外,而是从控制器导入它们,而控制器又可以从 /utils/ 或 /services 或类似文件导入它们的辅助方法。否则,您将在模型、路由和控制器中展开逻辑。 我基本上是在尝试发出 PUT 请求,但我很难创建一个。我的最后一个片段是我开始创建的。 Mongoose 还是 Sequelize 还是其他? sqlite3,抱歉缺少相关信息 然后我建议添加与 Sqlite (sequelize.org/master/manual/model-querying-basics.html) 一起使用的 Sequelize 并拥有不错的文档(在 *** 上找到很多帮助)。试试这篇文章:medium.com/@sarahdherr/… 和这个答案:***.com/questions/8158244/…(使用 findOne 或 findByPk 从数据库中检索一条记录,然后调用 ModelName.update(req.body, ... ) 以更新它。 【参考方案1】:

我从班上的某个人那里得到了一些帮助后才弄明白。我与const phoneNumber, password = req.body 走在了正确的轨道上。剩下的就是这个(或者这是所有的代码):

router.put("/:id/updateaccount", restrict(), async(req, res, next) => 
    try 
        const phoneNumber, password = req.body
        const userUpdate = await Users.updateUser(
          phoneNumber, password: await bcrypt.hash(password, 14)
         , req.params.id)
        
        res.status(200).json(
        userUpdate:userUpdate, message: "You have successfully updated your information",
        )
     catch(err) 
        next(err)
    
) 

我再次使用 bcrypt 加密新更新的密码

【讨论】:

以上是关于尝试在 node.js 中发出 PUT 请求的主要内容,如果未能解决你的问题,请参考以下文章

Node.JS 中的 HTTP DELETE 动词

尝试从 localhost:8080 向 localhost:3000 发出 GET 请求,但出现 cors 错误,并且在我的 node.js 服务器上安装 cors 并不能修复它

使用 Polymer Iron-ajax 和 Node.js 发出 CORS 请求

如何在没有浏览器的 node.js 中使用 FormData?

每次在 Node.js (Express.js) 中发出 API 请求之前,如何简化 Fetching Auth token?

使用颤振客户端向 node.js express api 发出 post 请求