我的项目中有一些node.js后端。为了加密密码,我使用bcrypt。为了比较数据库中来自requst的字符串密码和哈希密码,我使用bcrypt.compare函数。我的bcrypt.compare函数在代码中效果很好。我使用Postman对其进行了手动测试,并且在生产中运行良好。但是在使用 chai-http 和 mocha 的测试中,它挂起了。
测试。我将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)
}
}
有什么方法可以测试此功能?
其他信息
摩卡5.2.0版-全局和本地
节点v8.11.4
Windows 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"
}
答案 0 :(得分:0)
我相信这里存在一些问题,并且在一些地方可以找到资源。我不认为这是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的版本也将很有帮助。
答案 1 :(得分:0)
错误的行为与chai / mocha / bcript没有关联。这是由于以下陈述引起的
JobScheduler
正确的代码应为
} else {
res.status(401)
}
或
} else {
res.status(401).send(something)
}
我认为Express在.status()之后等待.send()并保持连接无响应