javascript تمكين كورس أنغولارجس لإرسال طلب هتب بوست



angularjs http-post (4)

هذه هي الطريقة التي لا كورس في التطبيقات الصريحة، عليك أن نتذكر حول أوبتيونس لأن لبعض الأطر هناك 2 المكالمات ل كورس، أول واحد هو أوبتيونس الذي يتحقق ما هي الأساليب المتاحة ومن ثم هناك مكالمة الفعلية، أوبتيونس تتطلب إجابة فارغة فقط 200 OK

شبيبة

allowCrossDomain = function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
  if ('OPTIONS' === req.method) {
    res.send(200);
  } else {
    next();
  }
};

app.use(allowCrossDomain);

أريد إرسال طلب هتب بوست عن طريق إرسال نموذج إلى خادمي، والذي في نطاق مختلف (وتمكين كورس في البرنامج النصي للخادم باستخدام node.js).

هذا هو السيناريو حيث جميع تكوينات الزاوي هي:

var myApp = angular.module('myApp', ['ngRoute']);

myApp.config(function($routeProvider, $locationProvider, $httpProvider) {

  $httpProvider.defaults.useXDomain = true;
  delete $httpProvider.defaults.headers.common['X-Requested-With'];

  $routeProvider
  .when('/', {
    controller: 'RouteCtrl',
    templateUrl: 'views/home_views.html'
  })
  .when('/login', {
    controller: 'RouteCtrl',
    templateUrl: 'views/login_views.html'
  })
  .when('/register', {
    controller: 'RouteCtrl',
    templateUrl: 'views/register_views.html'
  })
});

myApp.controller("UserController", function($scope, $http) {
  $scope.formData = {};
  $scope.clickMe = function() {
    console.log("Yay");
      $http({
        method: 'POST',
        url: 'http://localhost:8183/user/register',
        data: $.param($scope.formData),
      })
      .success(function(data) {
        console.log(data);
        if(!data.success) {
          console.log("error here");
        } else {
          console.log("error there");
        }
      });
  }
}); ...

أنا باستخدام أنغولارجس 1.2.22 وكما ذكر في هذا البرنامج التعليمي ( تمكين كورس ) لتمكين كورس، فإنه يحتاج إلى تمكين كورس يدويا في التكوين. لكنه لا يزال لا يعمل. إليك ما حصلت عليه من وحدة تحكم المتصفح.

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8183/user/register. This can be fixed by moving the resource to the same domain or enabling CORS.

أنا جديد تماما ل أنغولارجس لذلك أي مساعدة سيكون حقا موضع تقدير أن نشير إلى أي أخطاء قمت بها .. شكرا لك!

---- إديت: إضافة server.js النصي ----

var express = require('express'),
    app = express(),
    bodyParser = require('body-parser'),
    expressValidator = require('express-validator'),
    mysql = require('mysql'),
    crypto = require('crypto'),
    cors = require('cors'),
    uuid = require('node-uuid');

var connectionpool = mysql.createPool({
    connectionLimit: 1000,
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'cloudvm'
});

app.listen(8183);
app.use(bodyParser.urlencoded({
    extended: true
}));

app.use(bodyParser.json());
app.use(expressValidator());
app.use(cors());


var user_router = express.Router();
var user_list = user_router.route('/list');
var user_register = user_router.route('/register');
var user_login = user_router.route('/login');

app.use('/user', user_router);

user_register.post(function(req, res, next) {

    var errors = req.validationErrors();
    if (errors) {
        res.status(200);
        res.send(errors);
        console.log(errors);
        return;
    }
    var data = {
        name_user: req.body.name,
        email_user: req.body.email,
        password_user: req.body.password,
        no_telp_user: req.body.no_telp,
        company_name_user: req.body.company_name,
        address_user: req.body.address,
        name_cc_user: req.body.name_cc,
        address_cc_user: req.body.address_cc,
        no_cc_user: req.body.no_cc,
        no_vcv_user: req.body.no_vcv,
        expire_month_cc_user: req.body.expire_month,
        expire_year_cc_user: req.body.expire_year
    };

    connectionpool.getConnection(function(err, connection) {
        if (err) {
            console.error('CONNECTION ERROR:', err);
            res.statusCode = 503;
            res.send({
                result: 'error',
                err: err.code
            });
        } else {
            var sql = 'INSERT INTO user SET ?';
            console.log(sql)
            connection.query(sql, data, function(err, rows, fields) {
                if (err) {
                    console.error(err);
                    res.statuscode = 500;
                    res.send({
                        result: 'error',
                        err: err.code
                    });
                }
                res.send([{
                    msg: "registration succeed"
                }]);
                connection.release();
            });

        }

    });
});

حل

شكرا لك على الأجوبة الكريمة، ولكن تمكنت من تمكين كورس على النصي خادم (تشغيل على عقدة) ثم حاولت استخدام هذا

headers: { 'Content-Type': 'application/x-www-form-urlencoded' }

على النصي جانب العميل عند طلب هتب يسمى، ثم أخيرا اسمحوا لي للحصول على استجابة من الخادم دون وجود مشكلة كورس! لذلك، اعتقدت أنه قد يكون مشكلة رأس .. لذلك، شكرا لك على ردود النوع! نأمل أن يساعد ذلك أي شخص وجود هذه المشكلة في المستقبل!


لقد صارعت لفترة طويلة لتحقيق هذا، وأخيرا حصلت على حل لهذا الآن.

يمكنك تحقيق نفس الشيء على جانب الخادم بدلا من العبث حول جانب العميل. هنا هو تصفية كورس بسيطة تحتاج إلى إضافة على جانب الخادم.

package com.domain.corsFilter;

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    chain.doFilter(req, res);
}

public void init(FilterConfig filterConfig) {}

public void destroy() {}

}

ملاحظة: إذا كنت بحاجة إلى مساعدة بشأن الواردات للأعلى، فانتقل إلى موضوع الصفحة التالية: طلبات تصفية طلبات تصفية كورس ل كورس

أضف هذا الفلتر في web.xml

filter
    filter-name corsFilter filter-name
    filter-class com.domain.corsFilter.SimpleCORSFilter filter-class
filter
filter-mapping
    filter-name corsFilter filter-name
    url-pattern /* url-pattern
filter-mapping

أضف علامات '<'، '/>' في شفرة web.xml، واضطررت إلى الإزالة لنشر هذا التعليق.


أدت إضافة عنوان من نوع المحتوى إلى التالي إلى حل المشكلة بالنسبة لي.

[عدل] الطريقة الصحيحة هي
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }


لديك فقط لإضافة بعض خصائص رأس في رأس استجابة جانب الملقم.

هنا مثال لملقم نوديجس

app.all("/api/*", function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With");
  res.header("Access-Control-Allow-Methods", "GET, PUT, POST");
  return next();
});

فإنه سيتم حل أنجولارجس عبر أجاكس المكالمة عبر المجال.

لقد وجدت هذا الحل من كيفية تمكين كورس في أنغولارجس





httprequest