Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 更改注册用户的JSON响应_Node.js_Feathersjs - Fatal编程技术网

Node.js 更改注册用户的JSON响应

Node.js 更改注册用户的JSON响应,node.js,feathersjs,Node.js,Feathersjs,在用户服务中创建用户后,如何在FeathersJS中创建一个钩子,在JSON响应中返回带有用户对象的JWT令牌 我在users.hooks.js中尝试过: after: { all: [ // Make sure the password field is never sent to the client // Always must be the last hook protect('password')

在用户服务中创建用户后,如何在FeathersJS中创建一个钩子,在JSON响应中返回带有用户对象的JWT令牌

我在users.hooks.js中尝试过:

 after: {
        all: [
            // Make sure the password field is never sent to the client
            // Always must be the last hook
            protect('password')
        ],
        find: [],
        get: [],
        create: [
            function(hook) {
                const data = {
                    email: hook.data.email,
                    password: hook.data.password,
                    strategy: 'local'
                };

                return hook.app.service('authentication').create(data).then(page => {
                    page.user = hook.result;
                    hook.result = page;
                    return Promise.resolve(hook);
                });
            }
        ],
        update: [],
        patch: [],
        remove: []
    },

但是JSON响应保持不变。可以编辑FeathersJS身份验证模块吗?

我在尝试操作
context.result
hook.result
在您的情况下。您应该将其命名为
context

在我的理解中,
hook.result
是对从服务返回的实际对象的引用。因此,您可以随意操作该对象

但是,在您的情况下,您没有更改实际的
结果
对象,而是获取另一个对象-
页面
,对其进行操作,然后更改
钩子.result
以引用该新对象
页面
。未更改的实际
结果

hook.result = page;
上面这行是你的错误。你应该做的是:

hook.result.accessToken=page.accessToken

这样就可以操纵实际的响应对象

我会这样写你的函数:


然后,响应JSON将具有
accessToken
属性。

我在尝试操作
context.result
时遇到了类似的问题(
hook.result
在您的情况下。您应该将其命名为
context

在我的理解中,
hook.result
是对从服务返回的实际对象的引用。因此,您可以随意操作该对象

但是,在您的情况下,您没有更改实际的
结果
对象,而是获取另一个对象-
页面
,对其进行操作,然后更改
钩子.result
以引用该新对象
页面
。未更改的实际
结果

hook.result = page;
上面这行是你的错误。你应该做的是:

hook.result.accessToken=page.accessToken

这样就可以操纵实际的响应对象

我会这样写你的函数:


然后,响应JSON将具有
accessToken
属性。

要创建用户并添加令牌,需要考虑以下几点:

  • hook.data.password
    将是散列密码。维护原始登录信息的最佳方法是在
    hashPassword
    之前添加一个钩子,该钩子添加了
    params.login
    属性:

    const setLogin=options=>{ 返回上下文=>{ const{data}=上下文

    context.params.login = {
      strategy: 'local',
      email: data.email,
      password: data.password
    };
    
    return context;
    
    }); };

  • 然后可以使用
    params.login
    创建登录名。
    authentication
    服务还需要原始请求中的
    params

    const addAccessToken=()=>{ 返回异步上下文=>{ const{login}=context.params

    const jwt = await context.app.service('authentication')
      .create(login, context.params);
    
    context.result.accessToken = jwt.accessToken;
    
    return context;
    
    }); };

  • 然后,您的
    users.hooks.js
    文件类似于以下内容:

    module.exports = {
      before: {
        all: [],
        find: [ authenticate('jwt') ],
        get: [ authenticate('jwt') ],
        create: [ setLogin(), hashPassword(), gravatar() ],
        update: [ hashPassword(), authenticate('jwt') ],
        patch: [ hashPassword(), authenticate('jwt') ],
        remove: [ authenticate('jwt') ]
      },
    
      after: {
        all: [ 
          // Make sure the password field is never sent to the client
          // Always must be the last hook
          protect('password')
        ],
        find: [],
        get: [],
        create: [ addAccessToken() ],
        update: [],
        patch: [],
        remove: []
      },
    
      error: {
        all: [],
        find: [],
        get: [],
        create: [],
        update: [],
        patch: [],
        remove: []
      }
    };
    

    要创建用户并添加令牌,需要考虑以下几点:

  • hook.data.password
    将是散列密码。维护原始登录信息的最佳方法是在
    hashPassword
    之前添加一个钩子,该钩子添加了
    params.login
    属性:

    const setLogin=options=>{ 返回上下文=>{ const{data}=上下文

    context.params.login = {
      strategy: 'local',
      email: data.email,
      password: data.password
    };
    
    return context;
    
    }); };

  • 然后可以使用
    params.login
    创建登录名。
    authentication
    服务还需要原始请求中的
    params

    const addAccessToken=()=>{ 返回异步上下文=>{ const{login}=context.params

    const jwt = await context.app.service('authentication')
      .create(login, context.params);
    
    context.result.accessToken = jwt.accessToken;
    
    return context;
    
    }); };

  • 然后,您的
    users.hooks.js
    文件类似于以下内容:

    module.exports = {
      before: {
        all: [],
        find: [ authenticate('jwt') ],
        get: [ authenticate('jwt') ],
        create: [ setLogin(), hashPassword(), gravatar() ],
        update: [ hashPassword(), authenticate('jwt') ],
        patch: [ hashPassword(), authenticate('jwt') ],
        remove: [ authenticate('jwt') ]
      },
    
      after: {
        all: [ 
          // Make sure the password field is never sent to the client
          // Always must be the last hook
          protect('password')
        ],
        find: [],
        get: [],
        create: [ addAccessToken() ],
        update: [],
        patch: [],
        remove: []
      },
    
      error: {
        all: [],
        find: [],
        get: [],
        create: [],
        update: [],
        patch: [],
        remove: []
      }
    };