我的代码:
const model = require('../db/models/user');
const describe = require('mocha').describe;
const assert = require('chai').assert;
const chaiHttp = require('chai-http');
let chai = require('chai');
let server = require('../server');
chai.use(chaiHttp);
describe('Test user registration, login, update password', () => {
beforeEach((done) => {
// Reset user mode before each test
model.User.remove({}, (err) => {
console.log(err);
done();
})
});
现在,我得到了错误
UnhandledPromiseRejectionWarning:TypeError:无法读取属性 '_id'为空
在路线本身中,具体是:
router.put('/me/update-password', async (req, res, next) => {
const {body} = req;
const auth = req;
const userId = auth._id; // problem on this line!
// rest of code...
});
因此,注册并登录后(应该可以正常工作!),我在更新密码时遇到很多问题。在params
中,我将发送生成的令牌,在body
中,是带有新密码的密码字段。在实时示例(例如Postman)上,它可以正常工作,但在测试中,它根本不起作用。
我真的不知道,已经失去了很多时间(3天)。
有人可以看看建议解决方案吗?
非常感谢。
使用auth.js更新:
const jwt = require('jsonwebtoken');
const isAu = function(req) {
return jwt.verify(req.headers.authorization.split(' ')[1], 'secret', function (err, decoded) {
if (err) {
return null;
}
return decoded;
});
};
module.exports = isAu;
答案 0 :(得分:0)
编辑: 由于OP在回答后更改了原始问题,因此这里是原始链接:https://stackoverflow.com/revisions/55064109/1
=====================================
JWT验证方法接受授权令牌-您正在通过拆分授权标头字符串来正确地获取该令牌,以获取令牌。
HTTP Authorization标头字符串包含身份验证方案类型(Bearer,Basic,Digest等)和令牌值
Authorization: Bearer eyJhbGciOiJIUzI1NiIXVCJ9...TJVA95OrM7E20RMHrHDcEfxjoYZgeFONFh7HgQ
但是您在Chai请求中的Authorization
标头仅包含令牌的值,而不包含身份验证方案类型。
假设您的身份验证方案为 Bearer ,则需要在Chai请求授权标头中进行设置:
...
chai.request(server)
.put('/api/me/update-password')
.set('Authorization', `Bearer ${token}`)
.send(`${updatedPassword}`)
.end((error, response) => {
assert.equal(response.status, 200);
done();
});
...
另一方面,如果您未在请求授权标头中指定身份验证类型,则应像这样将其发送给JWT以进行验证:
const isAuthenticated = function(req) {
return jwt.verify(req.headers.authorization, 'secret', function (err, decoded) {
if (err) {
return null;
}
return decoded;
});
};