thinkjs / thinkjs

Use full ES2015+ features to develop Node.js applications, Support TypeScript.
https://thinkjs.org/
MIT License
5.31k stars 616 forks source link

如何全局处理后台api接口未登录的状态 #980

Closed chenchi2038 closed 6 years ago

chenchi2038 commented 6 years ago

DESC

在service中通过axios库来调用远程的api接口,如果接口返回401未授权的错误状态,这时候需要返回login.html给用户,提示用户登录。 目前是直接在service中抛出{status:401},然后配置trace中间件中401错误对应的模板:

    {
        handle : 'trace',
        enable : !think.isCli,
        options: {
            debug    : !isDev,
            templates: {
                401: path.join(__dirname, '../../view/login.html'),
            }
        }
    },

trace插件是直接输出了页面的文本内容,并没有通过模板引擎(nunjucks)来输出,请问如何通过模板引擎来输出这个登录页面呢? 或者换个位置,在trace插件的error回调函数中,可以拿到ctx对象,这里直接设置ctx.body,同样的问题,如果通过模板引擎来render登录页呢。

ENV

OS Platform:

Node.js Version:

ThinkJS Version:

code

// your code here

error message

// your error message here

more description

// your detail description

lizheming commented 6 years ago

我是创建了一个 base logic 然后再 __before 中判断了登录权限,所有要判断登录权限的的logic都继承这个 base,然后对应接口就会做登录校验。然后前端根据返回的错误跳转到登录页。可以参考下下面的项目代码:

https://github.com/thinkjs/pharos/blob/master/src/logic/api/base.js#L2-L8

chenchi2038 commented 6 years ago

这个是应用内的登录状态判断,和我的需要稍微有点差别。 目前在做的应用,所有的数据操作都是通过service调用接口来完成,如果后台接口返回401未登录,就需要redirect或者直接返回login.html,刚开始接触thinkjs,不太懂怎么实现。 @lizheming

lizheming commented 6 years ago

你这种只需要包一个公共的方法去处理底层服务的数据,内部统一判断下状态并抛401 的错误就好了。你调用 service 的地方不确定所以是没办法在 ThinkJS 的某一个环节统一做处理的。

chenchi2038 commented 6 years ago

是的 ,把所有远程api接口调用都封装到一个公共方法里,然后统一判断响应内容。 我找到办法了: