.put方法在摩卡咖啡请求中更新密码无效

时间:2019-03-08 13:21:32

标签: javascript node.js unit-testing mocha chai

我的代码:

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;

1 个答案:

答案 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;
  });
};