【问题标题】:Bcrypt.compare not executing in chai/mocha tests, but executing in codeBcrypt.compare 不在 chai/mocha 测试中执行,而是在代码中执行
【发布时间】:2018-09-18 11:15:59
【问题描述】:

我的项目中有一些 node.js 后端。要加密密码,我使用bcrypt。要将来自请求的字符串密码与数据库中的哈希密码进行比较,我使用了 bcrypt.compare 函数。我的 bcrypt.compare 函数在代码中运行良好。我用 Postman 手动测试了它,它在生产中运行良好。但在 chai-httpmocha 的测试中,它挂断了。

测试。我使用 mocha 和 chai-http 发出 http POST 请求:

describe('Testing login', () => {
  it('should return status 200 when there is such user in DB and password is correct', (done) => {
    chai.request(server)
    .post('/login')
    .send({
      login: 'test@test.test',
      password: 'somepassword'
    })
    .end((err, res) => {
      res.should.have.status(200)
      done()
    })
  })
})

控制器 bcrypt 函数如下所示:

async function auth (req, res) {
  let { login, password } = req.body
  try {
    let payload = {}
    let result = {}
    await
    User.findOne({ where: { userEmail: login } }).then(user => {      
      return result = user
    })
    bcrypt.compare(password, result.dataValues.password, await function (err, data) {
      if (err) {        
        throw Error(err)
      }
      if (result && data) {       
        payload.isAdmin = result.dataValues.isAdmin
        payload.ID = result.dataValues.id
        let token = jwt.sign(payload, 'yoursecret')
        res.status(200).send({ token: token })
      } else { res.status(401) }
    })
  } catch (error) {
    res.sendStatus(500)
  }
}

有什么方法可以测试这个功能吗?

其他信息
mocha 版本 5.2.0 - 全球和本地
节点 v8.11.4
窗户 10 x64

"devDependencies": {
  "@types/chai-as-promised": "^7.1.0",
  "chai": "^4.1.2",
  "chai-as-promised": "^7.1.1",
  "chai-http": "^4.2.0",
  "eslint": "^5.5.0",
  "eslint-config-standard": "^12.0.0",
  "eslint-plugin-import": "^2.14.0",
  "eslint-plugin-node": "^7.0.1",
  "eslint-plugin-promise": "^4.0.1",
  "eslint-plugin-standard": "^4.0.0",
  "express-unit": "^2.1.1",
  "mocha": "^5.2.0",
  "mock-express-request": "^0.2.2",
  "mock-express-response": "^0.2.2",
  "nyc": "^13.0.1",
  "proxyquire": "^2.1.0",
  "sinon": "^6.2.0",
  "supertest": "^3.3.0",
  "ws": "3.3.2"
}

【问题讨论】:

    标签: javascript express mocha.js chai bcrypt


    【解决方案1】:

    错误行为与 chai/mocha/bcript 无关。这是由以下语句引起的

        } else {
            res.status(401)
        }
    

    正确的代码应该是

        } else {
            res.status(401).send(something)
        }
    

        } else {
            res.sendStatus(401)
        }
    

    我认为 Express 在 .status() 之后等待 .send() 并保持连接而不响应

    【讨论】:

    • 我的回答中也包含了这个 ?‍♂️,但是很好的解释。
    【解决方案2】:

    我相信有一些问题,还有一些地方可以寻找资源。我不认为这是chai-http 的问题。

    MDN async/await functions
    Using bcrypt with Promises.

    这是您的路由处理程序的重写版本:

    async function auth(req, res) {
        let {
            login,
            password
        } = req.body
        try {
            let payload = {}
            let result = await User.findOne({
                where: {
                    userEmail: login
                }
            });
            const data = await bcrypt.compare(password, result.dataValues.password);
    
            if (result && data) {
                payload.isAdmin = result.dataValues.isAdmin
                payload.ID = result.dataValues.id
                let token = jwt.sign(payload, 'yoursecret')
                res.status(200).send({
                    token: token
                })
            } else {
                res.sendStatus(401)
            }
        } catch (error) {
            res.sendStatus(500)
        }
    }

    我不确定你是如何设置路由的,但一个常见的错误是没有正确处理异步函数,as express doesn't do this for you.

    如果这有帮助,请告诉我。查看您如何初始化路由以及您正在使用的 Node、Express、chai-http、bcrypt 和 jsonwebtoken 的版本也会很有帮助。

    【讨论】:

    • 感谢您的评论。路由正确初始化(代码在生产中运行良好 - 甚至是以前的版本)。我添加了您询问的其他信息。我根据您的建议修复了代码 - 现在它更干净了。但问题仍然存在。通过在代码中添加多个 console.log 可以很容易地看到 - bcrypt.compare 挂起而没有响应(测试运行时)
    猜你喜欢
    • 2015-03-21
    • 2021-07-16
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    相关资源
    最近更新 更多