微风·六:RequestOptions:请求方式(同步/异步)探究,及异步方式问题抛出

Posted 欧尼焦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微风·六:RequestOptions:请求方式(同步/异步)探究,及异步方式问题抛出相关的知识,希望对你有一定的参考价值。

文章目录

1 RequestOptions:请求方式(同步/异步)

1.1 问题产生

在使用ES高级客户端向ES服务器发送请求,使用同步请求方式创建索引库时,有段代码RequestOptions.DEFAULT,经查阅特指同步调用方式,当然会有异步调用。

1.2 问题分析

调用方式解释
同步方式① 以同步方式执行IndexRequest时,客户端必须等待返回结果IndexResponse;② 在收到IndexResponse后,客户端可继续执行代码
异步方式① 以异步方式执行IndexRequest时,高级客户端不必同步等待请求结果的返回,可直接向接口调用方式返回异步接口执行成功结果;② 为处理异步返回的响应结果或处理请求执行过程中引发的处理信息,用户需指定监听器ActionListener,若请求执行成功,则调用ActionListener的onRespose()方法,然后执行方法里相应逻辑处理;若请求执行失败,则调用ActionListener的onFailure()进行相应逻辑处理

1.2.1 同步方式

同步方式:

restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);

1.2.1 异步方式

异步方式:

estHighLevelClient.indexAsync(indexRequest, RequestOptions.DEFAULT, actionListener);

1.3 问题解决

1.3.1 异步方式代码

    /**
     * 向es服务器发送请求,创建索引,请求方式:异步
     */
    @Test
    public void testCreateIndex2()
        //目标:向es服务器发送请求,创建索引,请求方式:异步
        //1.创建request对象
        IndexRequest indexRequest = new IndexRequest("hetol");
        indexRequest.source(Constants.MAPPING,XContentType.JSON);
        //3.通过ES高级客户端向ES服务器通信
        ActionListener<IndexResponse> listener = new ActionListener<IndexResponse>() 
            @Override
            public void onResponse(IndexResponse indexResponse) 
                System.out.println("执行成功");
            

            @Override
            public void onFailure(Exception e) 
                System.out.println("执行失败"+e.getMessage());
            
        ;
        client.indexAsync(indexRequest,RequestOptions.DEFAULT,listener);
    

1.3.2 异步方式代码问题抛出

在执行此代码过程中,发现有两点问题:
① 在代码执行结束,发现ES中索引库创建成功
② 在索引库创建成功的同时,发现严重作物:执行成功,可以成功后逻辑进入onResponse( )方法,百思不得其解,为什么结果却是走了onFailure( )失败的方法,报错说意外断开连接,难道这个方法就是如此吗(执行完断开连接,可是onResponse( )方法里的逻辑不是也就不能走了)?

1.3.2.1 抛出问题分析

思路:看源码正在分析,如有见解,欢迎评论区留言、探讨。

1.4 参考资料

ES高级客户端文档操作实战
ES之6:restHighLevelClient源码

使用 laravel 微风检索登录请求中的关系表

【中文标题】使用 laravel 微风检索登录请求中的关系表【英文标题】:retrive relation table in login request with laravel breeze 【发布时间】:2022-01-03 15:32:24 【问题描述】:

您好,我想在登录时包含我的关系表角色。我使用 Laravel Breeze 进行身份验证。

模型/用户.php


namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable

    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var string[]
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    //old
    public function bookmarks()
        return $this->hasMany('App\Model\Post','post_bookmarks','user_id','post_id')->get();
        

    public function roles()
        return $this->belongsTo('App\Models\Roles','roles','role_id','id');
    

AuthenticatedSessionController.php


namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AuthenticatedSessionController extends Controller

    /**
     * Display the login view.
     *
     * @return \Illuminate\View\View
     */
    public function create()
    
        return view('auth.login');
    

    /**
     * Handle an incoming authentication request.
     *
     * @param  \App\Http\Requests\Auth\LoginRequest  $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function store(LoginRequest $request)
    
        $request->authenticate();

        $request->session()->regenerate();

        return redirect()->intended(RouteServiceProvider::HOME);
    

    /**
     * Destroy an authenticated session.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function destroy(Request $request)
    
        Auth::guard('web')->logout();

        $request->session()->invalidate();

        $request->session()->regenerateToken();

        return redirect('/');
    

LoginRequest.php


namespace App\Http\Requests\Auth;

use Illuminate\Auth\Events\Lockout;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;

class LoginRequest extends FormRequest

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    
        return true;
    

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    
        return [
            'email' => ['required', 'string', 'email'],
            'password' => ['required', 'string'],
        ];
    

    /**
     * Attempt to authenticate the request's credentials.
     *
     * @return void
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    public function authenticate()
    
        $this->ensureIsNotRateLimited();

        if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) 
            RateLimiter::hit($this->throttleKey());

            throw ValidationException::withMessages([
                'email' => __('auth.failed'),
            ]);
        

        RateLimiter::clear($this->throttleKey());
    

    /**
     * Ensure the login request is not rate limited.
     *
     * @return void
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    public function ensureIsNotRateLimited()
    
        if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) 
            return;
        

        event(new Lockout($this));

        $seconds = RateLimiter::availableIn($this->throttleKey());

        throw ValidationException::withMessages([
            'email' => trans('auth.throttle', [
                'seconds' => $seconds,
                'minutes' => ceil($seconds / 60),
            ]),
        ]);
    

    /**
     * Get the rate limiting throttle key for the request.
     *
     * @return string
     */
    public function throttleKey()
    
        return Str::lower($this->input('email')).'|'.$this->ip();
    

我使用 Laravel-breeze 进行身份验证。一切正常,但我想在用户登录时添加角色名称。如您所见,我也使用了关系,但我很困惑在哪里可以编写代码来获取我的关系表。这是我的代码,谁能告诉我该怎么做?

例如。 登录邮箱:poojan@gmail.com role_id = 1

在角色表中 id: 1, role_name = "Wholseler"

所以当我当前登录时,我正在获取用户数据,但我也想要角色表数据。

提前致谢

【问题讨论】:

所以你想将角色附加到用户权限?? 不,我已经为所有用户分配了角色,但是当用户登录时我也想检索角色名称。 所以你需要根据角色进行重定向吗?? 您提供的所有代码都已内置到框架中。你能告诉我到目前为止你尝试了什么 当我登录时,我也想要用户数据透视表数据,如您在示例中所见。 【参考方案1】:

你可以在你的用户模型中使用属性

protected $appends = ['role_name'];

public function getRoleNameAttribute()

    return $this->roles->first()->role_name ?? 'N/A';

使用上面的代码,您将在用户实例中获得 role_name 属性

如果您希望角色数据与用户数据的关系,请在用户模型中尝试此操作

protected $with = ['roles'];

【讨论】:

很好,它正在工作。我使用受保护的 $with = ['roles'];角色表的所有数据。太感谢了。我可以在 $with 中添加更多表吗,例如 $with = ['roles','products']; ? 是的,你可以添加多个表格

以上是关于微风·六:RequestOptions:请求方式(同步/异步)探究,及异步方式问题抛出的主要内容,如果未能解决你的问题,请参考以下文章

使用 laravel 微风检索登录请求中的关系表

Angular 2 单元测试错误:无法解析“RequestOptions”的所有参数

在序列中调用 React js Fetch 调用

Breeze、OData 和无 EF

利用bordertransparent实现微风

角度 + 微风 + mongoLab