AngularJS + Laravel 5 请求返回未定义

Posted

技术标签:

【中文标题】AngularJS + Laravel 5 请求返回未定义【英文标题】:AngularJS + Laravel 5 Request returns Undefined 【发布时间】:2016-09-04 15:36:52 【问题描述】:

所以我有我的 Laravel:

控制器:

public function store(CreateRoomRequest $request)

    //Code

创建房间请求:

class CreateRoomRequest extends Request

/**
 * 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 [
        'name' => 'required|unique:rooms|max:255',
        'short_description' => 'required',
        'long_room' => '',
        'long_other' => '',
        'long_houserules' => '',
        'long_neighbourhood' => '',
        'long_transportation' => '',
        'image' => '',
        'street' => 'required',
        'streetnumber' => 'required|numeric|max:5',
        'city' => 'required',
        'postalcode' => 'required|numeric|max:4',
        'roomnumber' => 'required',
        'type' => 'required|in:kamer,studio,loft, appartement, huis, villa, camper, boomhut, hut, trein, boot, tent, slaapzaal, zolder, overige',
        'link' => '',
        'latitude' => 'required',
        'longitude' => 'required',
        'ranking' => 'numeric'
    ];


/**
 * Return validation messages that apply to the request.
 *
 * @return array
 */
public function messages()

    return [
        'name.required' => 'Gelieve een advertentienaam in te vullen.',
        'name.unique' => 'Deze advertentienaam bestaat al. Gelieve een unieke advertentienaam in te vullen.',
        'name.max' => 'De advertentienaam is langer dan 255 tekens. Gelieve een kortere naam in te vullen.',
        'short_description.required' => 'Gelieve een description in te vullen.',
        'street.required' => 'Gelieve een straat in te vullen.',
        'streetnumber.required' => 'Gelieve u huisnummer in te vullen',
        'city.required' => 'Gelieve u stad in te vullen',
        'postalcode.required' => 'Gelieve u postcode in te vullen',
        'roomnumber.required' => 'Gelieve een kamernummer in te vullen.',
        'type.required' => 'Gelieve het type ruimte te specifiëren.',
        'type.in' => 'Het opgegeven type kamer is niet correct. Gelieve een geldig type te selecteren.',
        'latitude.required' => 'De opgegeven locatie kon niet gevonden worden. Gelieve een geldige locatie op te geven.',
        'longitude.required' => 'De opgegeven locatie kon niet gevonden worden. Gelieve een geldige locatie op te geven.'
    ];


在我的 Laravel 中,我有以下服务(在 Johnpapa 之后):

        function createRoom(roomCreateData) 
        console.log(roomCreateData);
        return $http(
            method: 'POST',
            url: 'api/rooms',
            headers:  'Content-Type' : 'application/x-www-form-urlencoded' ,
            data: $.param(roomCreateData)
        ).then(createRoomSuccess).catch(createRoomError);

        function createRoomSuccess(response) 
            $log.info('Creating room success: ' + response);
            return response;
        

        function createRoomError(error) 
            $log.info('Creating room failed because: ' + error);
            return error;
        
    

未经验证。一切正常(存储,...)。但是,当我想在验证错误时使用 CreateRoomRequest 验证我的数据时,我得到以下信息:

A 422 unprocessable Entity(这是正确的,因为这是 Laravel 在验证器失败时返回的内容(所以我的猜测是验证器有效)。 但是,我没有收到任何消息。我记录的每个返回都是未定义的。

Laravel 文档状态:

如果验证失败,将生成重定向响应以将用户发送回之前的位置。错误也将闪现到会话中,以便显示。如果请求是 AJAX 请求,将向用户返回带有 422 状态代码的 HTTP 响应,其中包括验证错误的 JSON 表示。

现在我的问题是:JSON 返回在哪里?

Ps:我也试过去掉我自定义的错误信息,结果一样。

提前致谢

【问题讨论】:

【参考方案1】:

422 是对此的正确响应。我认为您在这里缺少的是发生的事情是它触发了代码的error 部分,而实际的response object 需要对其应用一些突变(特别是抓住responseJSON 属性),以便来获取你想要的信息。

var errors = error.responseJSON;

如果responseJSON属性不可用,那么您可能需要手动解析responseText

var errors = JSON.parse(error.responseText);

现在errors 将以传统方式变为iteratable,您可以在循环期间收到error 消息。

for(var prop in errors)
    // errors[prop] has what you want now.

希望这可以解决问题。

【讨论】:

以上是关于AngularJS + Laravel 5 请求返回未定义的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS 和 Laravel - 跨域 CORS / XHR 请求缺少(记住)cookie

无法从 laravel 5 应用程序中的请求中解析 jwt 令牌

AngularJS 和 Laravel - CORS

AngularJS + Laravel 5 身份验证

使用 Laravel、JWT 和 Angularjs 批处理令牌

使用 Laravel 5.3 和 AngularJS 1.5 的路线行为不端